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