Spec-Zone.ru › C++

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* для внешней функции, которая, как правило, его повторно инициализирует.

1) Преобразует *this в адрес сохранённого объекта Pointer.
2) Преобразует *this в адрес объекта void*. Эта функция преобразования участвует в разрешении перегрузки только в том случае, если Pointer не совпадает с void*, и программа некорректна, если Pointer не является указателем.
Начальное значение объекта void* равно значению сохранённого объекта Pointer, преобразованному в void*, и любые изменения в нём влияют на значение Pointer, используемое в деструкторе. Доступ к объекту void* за пределами жизненного цикла *this приводит к неопределённому поведению.

После вызова одной из этих двух функций преобразования на объекте out_ptr_t другая вызываться на нём не должна, в противном случае поведение будет неопределённым.

Параметры

(нет)

Возвращаемое значение

1) Адрес сохранённого объекта Pointer.
2) Адрес объекта 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API