std::inout_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::inout_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.Примечания
Если объект, на который указывает возвращаемое значение, не был перезаписан, оно равно значению, которое адаптированный объект Smart содержал до создания.
В распространённых реализациях представление объекта каждого 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/inout_ptr_t/operator_ptr