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 的效果是不是在调用它的表达式之后持续?的主要内容,如果未能解决你的问题,请参考以下文章

带有就地多态容器的 std::launder

我在哪里可以找到 std::launder 的真正作用? [复制]

为啥这里需要 std::launder ?

C++20 中的 std::launder 用例

std::launder 替代 pre c++17

如何解释 std::launder 的可达性要求?