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)).
Пример
| Этот раздел не завершён Причина: нет примера |