std::out_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::out_ptr_t<Smart,Pointer,Args...>::operator void**
operator Pointer*() const noexcept; | (1) |
(начиная с C++23) (constexpr начиная с C++26) |
operator void**() const noexcept; | (2) | (начиная с C++23) |
Предоставляет адрес объекта Pointer или void* внешней функции, которая обычно повторно его инициализирует.
*this в адрес хранящегося объекта Pointer.*this был вызван operatorvoid**(), поведение не определено.*this в адрес объекта void*.std::is_same_v<Pointer, void*> является false.std::is_pointer_v<Pointer> является false, программа некорректна.ptr, удовлетворяющий всем следующим условиям: - Начальное значение
*ptrэквивалентно значению хранящегося объектаPointer, преобразованному в void*. - Любое изменение
*ptr, за которым не следует последующее изменение*this, влияет на значениеPointer, используемое в деструкторе.
*this был вызван operatorPointer*(), поведение не определено.*ptr обращаются вне времени жизни *this, поведение не определено.Возвращаемое значение
Pointer.Примечания
Если объект, на который указывает возвращаемое значение, не был перезаписан, он равен nullptr.
В распространённых реализациях представление объекта каждого Pointer, являющегося типом указателя, совместимо с представлением объекта void*, поэтому в таких реализациях объект void* обычно хранится в памяти, отведённой под объект Pointer, без необходимости в дополнительной памяти:
- Если реализация использует анализ псевдонимов на основе типов (который опирается на правило строгого псевдонимирования), можно использовать правильно выровненный подобъект-член типа std::byte[sizeof(void*)], и обе функции преобразования возвращают адрес объектов, неявно созданных в этом массиве.
- В противном случае для обеих функций преобразования можно использовать подобъект-член
Pointer, а operatorvoid** может непосредственно возвращать его адрес,reinterpret_cast, приведённый к типу void**.
Если Pointer является типом указателя, представление объекта которого несовместимо с представлением объекта void*, может потребоваться дополнительный флаг bool, чтобы записывать, вызывался ли operatorPointer* (или operatorvoid**).
Пример
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/out_ptr_t/operator_ptr