std::launder 和未定义的行为

std::launder and undefined behaviour

提问人:getsoubl 提问时间:11/21/2022 更新时间:11/21/2022 访问量:69

问:

我正在阅读有关 std::launder 以及何时使用以避免 UB 的 p0532r0。

下面有个例子。

template <typename T>  
class coreoptional  
{  
 private:  
 T payload;  
 public:  
 coreoptional(const T& t)  
 : payload(t) {  
 }  
 template<typename... Args>  
 void emplace(Args&&... args) {  
 payload.~T(); 
 ::new (&payload) T(std::forward<Args>(args)...); // * 
 }  


 const T& operator*() const & {  
 return payload; //
 }  
};  

int main()
{
coreoptional<X> optStr{42};  
optStr.emplace(77);  
std::cout << *optStr; // undefined behavior (probably outputs 42 or 77)  
}

我的问题是为什么这会导致UB? 当在放置 new 之前调用 emplace 时,对象 X 的析构函数称为 。 我希望上述内容定义明确。 在 C++ 标准 n4296 的 3.8 部分中有一个类似的例子

C++ undefined-reference placement-new

评论

1赞 dewaffled 11/21/2022
第 1 页上有来自标准的红色文本的引文:如果 T 包含 const 或 reference 成员,则它是 UB,因为标准说它是。

答: 暂无答案