std::inout_ptr_t<Smart,Pointer,Args...>::~inout_ptr_t
~inout_ptr_t(); | (с C++23) |
Сбрасывает адаптированный Smart объект значением изменённого Pointer объекта (или void* объекта, если operator void**() был вызван) и захваченными аргументами. release() может быть вызван на адаптированном Smart объекте, если он не был вызван конструктором.
Пусть
-
sобозначает адаптированныйSmartобъект, -
args...обозначает захваченные аргументы, -
pобозначает значение сохранённогоPointer, илиstatic_cast<Pointer>(*operator void**())еслиoperator void**был вызван, -
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/w/cpp/memory/inout_ptr_t/%7Einout_ptr_t