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

时间:2014-12-20 22:39:42

标签: c++ c++11 const

考虑代码:

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

2 个答案:

答案 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应为具有用户提供的默认构造函数的类类型。

显然,该类型没有用户提供的默认构造函数。