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) (since C++23)
operator void**() const noexcept;
(2) (since C++23)

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

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

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

Параметры

(нет)

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

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

Spec-Zone.ru

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