为什么析构函数即使在没有被调用时也需要可访问?

问题描述 投票:0回答:1

拥有类

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++ c++17 language-lawyer destructor temporary
1个回答
0
投票

编译器行为不正确(假设 C++17 或更高版本)。

在您的代码中,

X
的析构函数未显式调用,也未根据 [class.dtor]/14 句子 1句子 2 隐式调用,并且也不会根据 潜在调用 [class.dtor]/14 句子 6.

因此,删除析构函数应该并不重要。

© www.soinside.com 2019 - 2024. All rights reserved.