Namespaces
Variants

std::out_ptr_t<Smart,Pointer,Args...>:: operator Pointer*, std::out_ptr_t<Smart,Pointer,Args...>:: operator void**

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)
std::out_ptr_t
Member functions
out_ptr_t::operator Pointer* out_ptr_t::operator void**
Non-member functions
operator Pointer * ( ) const noexcept ;
(1) (начиная с C++23)
operator void ** ( ) const noexcept ;
(2) (начиная с C++23)

Предоставляет адрес объекта Pointer или void * внешней функции, которая обычно выполняет его повторную инициализацию.

1) Преобразует * this в адрес хранимого объекта Pointer .
2) Преобразует * this в адрес объекта типа void * . Эта функция преобразования участвует в разрешении перегрузки только если Pointer не совпадает с void * , и программа является некорректной, если Pointer не является типом указателя.
Начальное значение объекта void * равно значению сохраненного объекта Pointer , преобразованного в void * , и любая его модификация влияет на значение Pointer , используемое в деструкторе . Доступ к объекту void * за пределами времени жизни * this приводит к неопределенному поведению.

После того как одна из этих двух функций преобразования была вызвана для объекта out_ptr_t , другая не должна вызываться для него, в противном случае поведение не определено.

Содержание

Параметры

(нет)

Возвращаемое значение

1) Адрес сохраненного Pointer объекта.
2) Адрес объекта void * , удовлетворяющего вышеуказанным требованиям.

Примечания

Если объект, на который указывает возвращаемое значение, не был перезаписан, он равен nullptr .

В распространённых реализациях объектное представление каждого Pointer , являющегося типом указателя, совместимо с представлением void * , и поэтому такие реализации обычно хранят объект void * в памяти, отведённой для объекта Pointer , без необходимости в дополнительной памяти:

  • Если реализация включает анализ псевдонимов на основе типов (который опирается на правило строгого псевдонимирования ), может использоваться правильно выровненный std:: byte [ sizeof ( void * ) ] подобъект-член, и обе функции преобразования возвращают адрес объектов, неявно созданных внутри массива.
  • В противном случае, подобъект-член Pointer может использоваться для обеих функций преобразования, и (2) может напрямую возвращать его адрес reinterpret_cast в void ** .

Если Pointer является типом указателя, чьё представление объекта несовместимо с представлением void * , может потребоваться дополнительный bool флаг для записи того, была ли вызвана (1) (или (2) ).

Пример