代码之家  ›  专栏  ›  技术社区  ›  Leo Heinsaar

删除默认构造函数a::a()时,为什么要编译“a”呢?[复制品]

  •  3
  • Leo Heinsaar  · 技术社区  · 7 年前

    下面是有问题的代码示例:

    struct A {
        A() = delete;
    };
    
    int main()
    {
    //  A a(); // compiles, since it's a function declaration (most vexing parse)
    //  A a;   // does not compile, just as expected
        A a{}; // compiles, why? The default constructor is deleted.
    }
    

    试试看 here 使用任何可用的编译器。我尝试了几次,但没有找到一次出现编译错误。

    2 回复  |  直到 7 年前
        1
  •  5
  •   lubgr    7 年前

    这是一个当前的语言问题,很可能很快就会解决。可以找到解决必要设计变更的建议 here . 根据提案摘要:

    C++允许某些类型的用户声明构造函数通过聚合初始化。 初始化,绕过这些构造函数。结果是代码令人惊讶、混乱, 还有马车

        2
  •  2
  •   songyuanyao    7 年前

    因为 A 是一个 aggregate type 然后给出 A a{}; 执行聚合初始化。

    direct public base, (since C++17) 数组元素或非静态类成员,按照类定义中数组下标/外观的顺序,从初始值设定项列表的相应子句复制初始化。

    在聚合初始化中,每个成员或元素(如果有的话)都将被直接复制初始化,构造函数被绕过;因此 delete 艾德和不重要。

    请注意,显式删除的构造函数允许用于聚合类型(因为C++ 11)(直到C++ 20),

    没有用户提供的构造函数(显式默认或删除构造函数是允许的)(因为C++ 11)(直到C++ 17)

    没有用户提供的、继承的或显式的构造函数(显式默认或删除构造函数是允许的)(因为C++ 17)(直到C++ 20)