考虑一下代码:
struct Foo
{
int x = 10;
};
int main()
{
const Foo foo;
}
Run Code Online (Sandbox Code Playgroud)
它在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
Run Code Online (Sandbox Code Playgroud)
我不确定谁在这里.为什么我们需要一个默认的ctor,因为我们执行了类内初始化?
如果类型对象具有用户提供的默认构造函数,则只能对其进行默认初始化.来自[dcl.init]/7:
如果程序要求对const限定类型的对象进行默认初始化
T
,T
则应为具有用户提供的默认构造函数的类类型.
你的班级Foo
没有那个; 存在brace-or-equals-initializer不会创建用户提供的默认构造函数.相反,您的类具有隐式定义的默认构造函数,其操作包含了brace-or-equals-initializer所请求的初始化.(Clang是对的.)
([dcl.fct.def.default],特别是第5段,涉及"用户提供","明确默认","隐式声明"和"定义为已删除"的定义.整个部分值得了解.)
顺便说一句,在C++ 11中很容易避免默认初始化:
const Foo foo {}; // hunky-dory
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
141 次 |
最近记录: |