Spec-Zone.ru › C++

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API