clang和g ++在处理const对象时的差异

vso*_*tco 6 c++ const c++11

考虑一下代码:

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,因为我们执行了类内初始化?

Ker*_* SB 7

如果类型对象具有用户提供的默认构造函数,则只能对其进行默认初始化.来自[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)