5

考虑以下示例代码:

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::launderlast 的效果是否超出了调用它的表达式?或者,我们std::launder每次需要访问更新的值时都必须使用u.x.n?

4

1 回答 1

5

cppereference对此非常明确:

std::launder 对其参数没有影响。必须使用它的返回值来访问对象。因此,丢弃返回值总是错误的。

至于标准本身,它没有说明它的参数也被清洗(或没有),但函数的签名表明,在我看来:指针是按值获取的,而不是通过引用获取的,因此它不能在调用者可见的任何方式。

于 2021-12-02T09:16:30.433 回答