使用C ++ 20中删除的默认构造函数初始化聚合

Ale*_* R. 6 c++ deleted-functions aggregate-initialization c++17 c++20

有一个包含POD的结构,默认构造函数已删除。尝试对struct实例进行汇总初始化时,使用编译时会在g ++ 9.1中导致编译错误-std=c++2a。相同的代码可以使用编译-std=c++17

https://godbolt.org/z/xlRHLL

struct S
{
    int a;
    S() = delete;
};

int main()
{
    S s {.a = 0};
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 9

struct自C ++ 20起,您不是一个合计。

聚合的定义再次更改:

cppreference

聚合是以下类型之一:

  • ...

  • 类类型(通常是structor union),具有

    • ...

    • 没有用户提供的,继承的或显式的构造函数(允许使用显式默认或删除的构造函数)
      (自C ++ 17起)(直到C ++ 20)

    • 没有用户声明或继承的构造函数
      (自C ++ 20起)

IMO,这修复了语言缺陷。在我看来,能够使用已删除或无法访问的构造函数构造(使用汇总初始化)对象。

  • 这是做到这一点的提案,其中包括基本原理:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1008r1.pdf (10认同)