考虑以下示例代码:
struct X { const int n; };
union U { X x; float f; };
void fun() {
U u = {{ 1 }};
u.f = 5.f; // OK, creates new subobject of 'u'
X *p = new (&u.x) X {2}; // OK, creates new subobject of 'u'
if(*std::launder(&u.x.n) == 2){// condition is true because of std::launder
std::cout << u.x.n << std::endl; //UB here?
}
}
fun
根据语言标准打印什么功能?换句话说,std::launder
last 的效果是否超出了调用它的表达式?或者,我们std::launder
每次需要访问更新的值时都必须使用u.x.n
?