Spec-Zone.ru › C++

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

Spec-Zone.ru

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