为什么'A a {};' 删除默认构造函数A :: A()时编译?

Leo*_*aar 3 c++ language-lawyer uniform-initialization c++11

这是有问题的代码示例:

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.
}
Run Code Online (Sandbox Code Playgroud)

在这里尝试使用任何可用的编译器.我尝试了几个,没有找到一个编译错误.

lub*_*bgr 5

这是当前的语言问题很快就会得到解决.可以在此处找到解决必要设计更改的提案.从提案的摘要:

C++目前允许一些具有用户声明的构造函数的类型通过聚合初始化进行初始化,绕过这些构造函数.结果是令人惊讶,混乱和错误的代码

  • "语言缺陷"是指特定的东西.这不是语言缺陷.这是一个设计变化. (2认同)