You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:49:58