此代码:
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
答案 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月起),但似乎已被遗忘。