考虑代码:
struct Foo
{
int x = 10;
};
int main()
{
const Foo foo;
}
它在g ++ http://coliru.stacked-crooked.com/a/99bd8006e10b47ef下编译,但在clang ++ http://coliru.stacked-crooked.com/a/93f94f7d9625b579下吐出错误:
error: default initialization of an object of const type
'const Foo' requires a user-provided default constructor
我不确定谁在这里。为什么我们需要一个默认的ctor,因为我们执行了类内初始化?
答案 0 :(得分:7)
如果类型对象具有用户提供的默认构造函数,则只能对其进行默认初始化。来自[dcl.init] / 7:
如果程序要求对const限定类型
T
的对象进行默认初始化,则T
应为具有用户提供的默认构造函数的类类型。
你的班级Foo
没有; brace-or-equals-initializer 的存在不会创建用户提供的默认构造函数。相反,您的类具有隐式定义的默认构造函数,其操作包含 brace-or-equals-initializer 所请求的初始化。 (Clang是对的。)
([dcl.fct.def.default],特别是第5段,涉及"用户提供的","明确默认","隐含声明& #34;和"定义为已删除"。整个部分值得了解。)
顺便说一下,在C ++ 11中很容易避免默认初始化:
const Foo foo {}; // hunky-dory
答案 1 :(得分:3)
clang根据8.5 [dcl.init]第7段最后一句似乎是正确的:
如果程序要求
const
- 限定类型T
的对象的默认初始化,T
应为具有用户提供的默认构造函数的类类型。
显然,该类型没有用户提供的默认构造函数。