2.6 KiB
[ptr.launder]
17 Language support library [support]
17.6 Dynamic memory management [support.dynamic]
17.6.5 Pointer optimization barrier [ptr.launder]
template<class T> constexpr T* launder(T* p) noexcept;
Mandates: !is_function_v && !is_void_v is true.
Preconditions: p represents the address A of a byte in memory.
An object X that is within its lifetime and whose type is similar to T is located at the address A.
All bytes of storage that would be reachable through ([basic.compound]) the result are reachable through p.
Returns: A value of type T* that points to X.
Remarks: An invocation of this function may be used in a core constant expression if and only if the (converted) value of its argument may be used in place of the function invocation.
[Note 1:
If a new object is created in storage occupied by an existing object of the same type, a pointer to the original object can be used to refer to the new object unless its complete object is a const object or it is a base class subobject; in the latter cases, this function can be used to obtain a usable pointer to the new object.
See [basic.life].
â end note]
[Example 1: struct X { int n; };const X p = new const X{3};const int a = p->n;new (const_cast<X>(p)) const X{5}; // p does not point to new object ([basic.life]) because its type is constconst int b = p->n; // undefined behaviorconst int c = std::launder(p)->n; // OK â end example]