删除的析构函数是否会更改 C++ 中的聚合初始化?
Does deleted destructor change aggregate initialization in C++?
代码如下
struct B {
~B() = delete;
};
B * b = new B{};
无法在最新的 MSVC 中编译并出现错误:
error C2512: 'B': no appropriate default constructor available
note: Invalid aggregate initialization
同时GCC和Clang都没有看出代码有什么问题,demo:https://gcc.godbolt.org/z/va9vcsEed
假设只是 MSVC 中的错误是否正确?
总的来说,析构函数的存在或删除是否会改变聚合初始化的任何规则?
C++ 标准中聚合概念的定义均未提及析构函数。
例如,C++ 20(9.4.2 聚合)中聚合的定义听起来如下
1 An aggregate is an array or a class (Clause 11) with
(1.1) — no user-declared or inherited constructors (11.4.5),
(1.2) — no private or protected direct non-static data members (11.9),
(1.3) — no virtual functions (11.7.3), and
(1.4) — no virtual, private, or protected base classes (11.7.2).
如果在 MS VS 2019 中执行此语句
std::cout << std::is_aggregate_v<B> << '\n';
那么输出将是1
。
另一方面,默认构造函数被定义为已删除(C++ 20 标准,11.4.5.2 默认构造函数)if
(2.8) — any potentially constructed subobject has a type with a
destructor that is deleted or inaccessible from the defaulted default
constructor.
但是在提供的示例中没有这样的子对象。
看来这是 MS VS 2019 的编译器错误。
代码如下
struct B {
~B() = delete;
};
B * b = new B{};
无法在最新的 MSVC 中编译并出现错误:
error C2512: 'B': no appropriate default constructor available
note: Invalid aggregate initialization
同时GCC和Clang都没有看出代码有什么问题,demo:https://gcc.godbolt.org/z/va9vcsEed
假设只是 MSVC 中的错误是否正确?
总的来说,析构函数的存在或删除是否会改变聚合初始化的任何规则?
C++ 标准中聚合概念的定义均未提及析构函数。
例如,C++ 20(9.4.2 聚合)中聚合的定义听起来如下
1 An aggregate is an array or a class (Clause 11) with
(1.1) — no user-declared or inherited constructors (11.4.5),
(1.2) — no private or protected direct non-static data members (11.9),
(1.3) — no virtual functions (11.7.3), and
(1.4) — no virtual, private, or protected base classes (11.7.2).
如果在 MS VS 2019 中执行此语句
std::cout << std::is_aggregate_v<B> << '\n';
那么输出将是1
。
另一方面,默认构造函数被定义为已删除(C++ 20 标准,11.4.5.2 默认构造函数)if
(2.8) — any potentially constructed subobject has a type with a destructor that is deleted or inaccessible from the defaulted default constructor.
但是在提供的示例中没有这样的子对象。
看来这是 MS VS 2019 的编译器错误。