Spec-Zone.ru › C++

std::inout_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::inout_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*, удовлетворяющий указанным выше требованиям.

Примечания

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

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

Spec-Zone.ru

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