C++17中placement new构造X(X())为何需可访问析构函数?
为什么C++17中
new (ptr) X(X())要求析构函数可访问? 当我们通过定位new表达式new (ptr) X(X())初始化类X的对象时,从C++17标准开始,编译器会强制要求X的析构函数必须可访问(即不能是private或已删除状态)。但从代码逻辑来看,这段操作似乎应该直接在ptr指向的内存区域调用默认构造函数完成初始化,完全不会涉及临时对象,为什么会有这个要求?
示例代码如下:
struct X { X() { } X(const X&) = delete; X(X&&) = delete; ~X() = delete; // 或设为private }; void test(void* ptr) { new (ptr) X(X()); // 编译错误:尝试使用已删除的函数 }
更新
曾有类似问题探讨“C++中强制返回值优化(RVO)为何需要公开析构函数”,但本例中用“异常触发临时对象析构”的解释并不成立,目前未发现相关适用场景。
内容的提问来源于Stack Exchange,提问作者Daniel Langr
相关产品推荐
相关产品推荐

