为什么gcc和msvc允许没有用户提供的构造函数的const对象?这是一个错误吗?

时间:2016-03-31 11:20:23

标签: c++ gcc visual-c++ clang language-lawyer

此代码:

class A {
public:
    A() = default;
};

int main()
{
   const A a;

   return 0;
}

可以在Visual C ++(来自VS 2015 Update 2)和GCC(5.3.1)中编译而没有错误,但无法使用Clang编译,它会出现此错误:

test.cpp:8:13: error: default initialization of an object of const type
      'const A' without a user-provided default constructor
           const A a;
                   ^
                    {}
1 error generated.

谁是对,铿锵或gcc和MSVC? 其他编译器行为是否是一个错误?

PS。编译const A a{};时所有三个都没有错误。 如果我们定义空构造函数,则相同:A::A() {}

PPS。这不是重复的。我强调实际问题。

更新提交了MSVC中的错误:https://connect.microsoft.com/VisualStudio/feedback/details/2538005 S.T.L.说他们正在修复所有这些以符合铿锵声测试:https://twitter.com/StephanTLavavej/status/715923311796953089

1 个答案:

答案 0 :(得分:2)

gcc符合DR253; Why does gcc allow a const object without a user-declared default constructor but not clang?请注意,gcc不需要存在显式默认的默认构造函数:

struct A {};  // No uninitialized members
int main() {
   const A a; // OK with gcc
}

MSVC不符合,因为它允许在A具有未初始化的数据成员时编译代码,无论是否存在明确默认的默认构造函数,但它至少会发出诊断( C4269)所以它应该很容易使符合:

struct A { int i; }; // Uninitialized data member
int main() {
   const A a;  // Should be ill-formed; MSVC accepts with diagnostic
}
  

main.cpp(8):警告C4269:'a':'const'自动数据用编译器生成的默认构造函数初始化产生不可靠的结果

clang有patch accepted and ready to land(自2015年6月起),但似乎已被遗忘。