编译器对const对象的投诉未初始化

时间:2012-01-21 10:29:15

标签: c++ constructor const default-constructor

  

可能重复:
  uninitialized const

我知道const对象需要初始化。

所以对于以下代码,

class sample
{};

int main()
{
   const sample obj;
   return 0;
}

编译器会抱怨因为const对象obj未初始化。

但是当我使用默认构造函数修改代码(如下所示)时,编译器不会抛出任何错误。

class sample
{
    public:
       sample() { }
};

int main()
{
    const sample obj;
    return 0;
}

新添加的默认ctor能满足编译器的是什么?

2 个答案:

答案 0 :(得分:4)

新添加的默认ctor能满足编译器的是什么?

因为这是C ++标准在用const qualifer声明对象时强加的要求。

<强>参考:

C ++ 03 8.5初始化程序8声明者
§9:

  

如果没有为对象指定初始化程序,并且该对象是(可能是cv限定的)非POD类类型(或其数组),则该对象应默认初始化; 如果对象是const限定类型,则底层类类型应具有用户声明的默认构造函数。否则,如果没有为非静态对象指定初始化程序,则该对象及其子对象(如果有) ,具有不确定的初始值90);如果对象或其任何子对象是const限定类型,则程序格式不正确。

答案 1 :(得分:1)

您正在进行const限定类型的默认初始化。 C ++(C ++ 11 draft n3290)标准对此有这样的说法(§8.5/ 6 Initializers):

  

如果程序要求对const限定类型T的对象进行默认初始化,则T应为具有用户提供的默认构造函数的类类型。

您的第一个示例不符合此要求(没有用户提供的构造函数)。第二个。