std::inout_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::inout_ptr_t<Smart,Pointer,Args...>::operator void**
operator Pointer*() const noexcept; | (1) | (since C++23) |
operator void**() const noexcept; | (2) | (since C++23) |
Возвращает адрес объекта Pointer или void* внешней функции, которая, как правило, освобождает право собственности, представленное его значением, а затем повторно инициализирует его.
*this в адрес сохранённого объекта Pointer. *this в адрес объекта void*. Данная функция преобразования участвует в разрешении перегрузки только в том случае, если Pointer не совпадает с void*, и программа будет некорректной, если Pointer не является типом указателя.Начальное значение объекта
void* равно значению сохранённого объекта Pointer, преобразованному в void*, и любые изменения в нём влияют на значение Pointer, используемое в деструкторе. Обращение к объекту void* за пределами срока существования *this приводит к неопределённому поведению.После вызова одной из этих двух функций преобразования для объекта inout_ptr_t, другая функция не должна вызываться для него, в противном случае поведение неопределённо.
Параметры
(нет)
Возвращаемое значение
Pointer. void*, удовлетворяющего вышеуказанным требованиям. Примечания
Если объект, на который указывает возвращаемое значение, не был перезаписан, он равен значению, хранящемуся в адаптированном объекте Smart до создания.
В распространённых реализациях представление объекта каждого 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/inout_ptr_t/operator_ptr