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

C++ 未初始化const对象的编译器投诉,c++,constructor,constants,default-constructor,C++,Constructor,Constants,Default Constructor,可能重复: 我知道常量对象需要初始化 对于下面的代码 class sample {}; int main() { const sample obj; return 0; } 编译器会抱怨,因为const对象obj未初始化 但是当我使用默认构造函数修改代码(如下所示)时,编译器不会抛出任何错误 class sample { public: sample() { } }; int main() { const sample obj; retu

可能重复:

我知道常量对象需要初始化

对于下面的代码

class sample
{};

int main()
{
   const sample obj;
   return 0;
}
编译器会抱怨,因为const对象
obj
未初始化

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

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

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

新添加的默认ctor所做的使编译器满意的事情是什么?

您正在对const限定类型进行默认初始化。C++(C++ 11草案N32 90)标准对此有说明(Po.85/6初始化器):

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


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

新添加的默认构造函数所做的哪些事情满足了编译器的要求?

因为这是C++标准在用<代码>对象const <代码> Qualuff.< /P>声明对象时所提出的要求。 参考资料:

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

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


+1好消息。此外,MSVS2008中还有一个bug:)+1。这是更完整的答案。@Als:我无法从标准中理解。你能用你的话解释一下标准吗。我不理解短语<代码>默认初始化。@ LinuxPenseur:C++标准将对象的声明分为3种可能的方式:默认初始化,值初始化和零初始化。您创建对象的方式相当于默认初始化。也许我的答案有助于理解每种方式的含义。如果不是,请询问。@Als:谢谢链接。我已走上正轨。也许你对这个问题的回答会有所帮助。为什么编译器生成的构造函数不能初始化第一个示例代码中的const对象?@LinuxPenseur-编译器生成的构造函数不会初始化C语言未初始化的类型。如果它确实如此,C++将失去对互联网的大量基准。