std::inout_ptr_t<Smart,Pointer,Args...>::~inout_ptr_t
~inout_ptr_t(); |
(начиная с C++23) (constexpr начиная с C++26) |
Сбрасывает адаптированный объект Smart значением изменённого объекта Pointer (или объекта void*, если был вызван operatorvoid**()) и сохранёнными аргументами. release() может быть вызван для адаптированного объекта Smart, если он не был вызван конструктором.
Пусть
-
sобозначает адаптированный объектSmart, -
argsобозначает сохранённые аргументы, -
pобозначает значение сохранённогоPointerилиstatic_cast<Pointer>(*operator void**()), если был вызван operatorvoid**, -
SP— это- Smart::pointer, если оно допустимо и обозначает тип, иначе
- Smart::element_type*, если Smart::element_type допустимо и обозначает тип, иначе
- std::pointer_traits<Smart>::element_type*, если std::pointer_traits<Smart>::element_type допустимо и обозначает тип, иначе
-
Pointer,
-
/*do-release*/обозначаетs.release(), если конструктор не вызываетrelease(), иначе — пустое значение.
Если Smart является типом указателя, деструктор выполняет s = static_cast<Smart>(p);, и программа некорректна, если sizeof...(Args) > 0;
иначе, если s.reset(static_cast<SP>(p), std::forward<Args>(args)...) корректно сформировано, деструктор выполняет /*do-release*/; if (p) { s.reset(static_cast<SP>(p), std::forward<Args>(args)...); };
иначе, если std::is_constructible_v<Smart, SP, Args...> является true, деструктор выполняет /*do-release*/; if (p) { s = Smart(static_cast<SP>(p), std::forward<Args>(args)...); };
в противном случае программа некорректна.
Примечания
Реализация может выделить память для структуры данных, необходимой для Smart (например, управляющего блока), при конструировании, чтобы оставить деструктору только операции, не способные выбросить исключение.
Аргументы, сохранённые по значению, уничтожаются после сброса.
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| DR | Применён к | Поведение согласно опубликованному стандарту | Корректное поведение |
|---|---|---|---|
| LWG 3897 | C++23 | деструктор не присваивал обычному указателю нулевое значение | присваивает |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/inout_ptr_t/~inout_ptr_t