提问人:getsoubl 提问时间:11/21/2022 更新时间:11/21/2022 访问量:69
std::launder 和未定义的行为
std::launder and undefined behaviour
问:
我正在阅读有关 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 部分中有一个类似的例子
答: 暂无答案
评论