拥有类
X
,以下对象初始化:
new (ptr) X(X());
即使从 C++17 开始也需要一个可访问的析构函数。为什么当对象由默认构造函数直接在
ptr
指向的存储中初始化时,不应该涉及临时对象?
示例代码:
struct X {
X() { }
X(const X&) = delete;
X(X&&) = delete;
~X() = delete; // or, e.g, private
};
void test(void* ptr) {
new (ptr) X(X()); // error: attempt to use a deleted function
}
演示:https://godbolt.org/z/Khac1z8r3
更新
这是一个类似的问题:为什么 C++ 中的强制 RVO 需要公共析构函数?。但我的情况不同,因为在我的代码中,由于异常而导致的潜在析构函数调用的问题不适用(或者,至少,我在那里看不到它)。
编译器行为不正确(假设 C++17 或更高版本)。
在您的代码中,
X
的析构函数未显式调用,也未根据 [class.dtor]/14 句子 1 或 句子 2 隐式调用,并且也不会根据 潜在调用 [class.dtor]/14 句子 6.
因此,删除析构函数应该并不重要。