std::launder
STD::洗钱
Defined in header | | |
---|---|---|
template <class T> constexpr T* launder(T* p) | | (since C++17) |
获取指向在同一类型的现有对象占用的存储中创建的对象的指针,即使该对象具有Const或引用成员。
正式的,给的。
- 指针
p
表示地址。A
内存中的字节
- 对象
X
位于地址A
X
在它的范围内寿命
- 类型
X
是相同的T
,忽略每个级别的cv-限定符。
- 通过结果可以到达的每个字节都可以通过p%28字节到达,如果这些字节位于对象%27s存储中,或者在对象的元素%29中,则可以通过指向对象的指针来访问这些字节。
然后std::launder(p)
返回类型的值。T*
指向对象的X
...
如果程序格式不正确,则为T
是函数类型还是%28可能是cv-限定%29?void
...
std::launder
可用于核心常数表达式如果它的参数的值可以用在核心常量表达式中。
例外
noexcept
规格:
noexcept
注记
对于没有Const或引用成员的对象,std::launder
没有必要;指针和引用可以是重用...
例
二次
#include <new>
struct X {
const int n; // note: X has a const member
int m;
};
int main()
{
X *p = new X{3};
const int a = p->n;
new (p) X{5}; // p does not point to new object because X::n is const
const int b = p->n; // undefined behavior
const int x = p->m; // undefined behavior (even though m is non-const, p can't be used)
const int c = std::launder(p)->n; // OK, std::launder(p) points to new object
}
二次
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。