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)
(constexpr начиная с C++26)
operator void**() const noexcept;
(2) (начиная с C++23)

Предоставляет адрес объекта Pointer или void* внешней функции, которая обычно повторно его инициализирует.

1) Преобразует *this в адрес хранящегося объекта Pointer.
Если для *this был вызван operatorvoid**(), поведение не определено.
2) Преобразует *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, поведение не определено.

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

1) Указатель на хранящийся объект Pointer.
2) Указатель на объект void*, удовлетворяющий вышеуказанным требованиям.

Примечания

Если объект, на который указывает возвращаемое значение, не был перезаписан, он равен nullptr.

В распространённых реализациях представление объекта каждого 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/out_ptr_t/operator_ptr

Spec-Zone.ru

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