Namespaces
Variants

std::inout_ptr_t<Smart,Pointer,Args...>:: ~inout_ptr_t

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
~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 Applied to Behavior as published Correct behavior
LWG 3897 C++23 деструктор не обновлял сырой указатель до нулевого значения обновляет