std::launder 的效果是不是在调用它的表达式之后持续?
Posted
技术标签:
【中文标题】std::launder 的效果是不是在调用它的表达式之后持续?【英文标题】:Does the effect of std::launder last after the expression in which it is called?std::launder 的效果是否在调用它的表达式之后持续? 【发布时间】:2022-01-08 17:28:16 【问题描述】:考虑以下示例代码:
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
的效果是否持续超出调用它的表达式?或者,我们每次需要访问u.x.n
的更新值时都必须使用std::launder
?
【问题讨论】:
你test it了吗? 如何测试 UB? @PaulSanders 对于std::launder
和类似深奥的东西,我不相信任何实际测试。
@SebastianRedl 是的,你可能是对的。
赞成你的评论,@JohnZ.Li :)
【参考方案1】:
cppereference 对此非常明确:
std::launder 对其参数没有影响。必须使用它的返回值来访问对象。因此,丢弃返回值总是错误的。
至于标准本身,它没有声明它的参数也被清洗(或没有),但函数的签名表明,在我看来:指针是按值获取的,而不是通过引用获取的,因此它不能以任何对调用者可见的方式进行更改。
【讨论】:
以上是关于std::launder 的效果是不是在调用它的表达式之后持续?的主要内容,如果未能解决你的问题,请参考以下文章