【问题标题】:Compiler complaints for const object not initialized [duplicate]未初始化 const 对象的编译器投诉 [重复]
【发布时间】:2012-02-15 15:50:56
【问题描述】:

可能重复:
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做了什么让编译器满意的事情?

【问题讨论】:

    标签: c++ constructor constants default-constructor


    【解决方案1】:

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

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

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

    【讨论】:

    • +1 好信息。此外,MSVS 2008 中存在一个错误 :)
    【解决方案2】:

    新添加的默认ctor做了什么让编译器满意的事情?

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

    参考:

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

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

    【讨论】:

    • +1。这是更完整的答案。
    • @Als:我无法从标准中理解。你能用你的话解释一下标准吗?我也听不懂default-initialized这句话。
    • @LinuxPenseur:C++ 标准将对象的声明分为 3 种可能的方式:默认初始化值初始化零初始化。您创建对象的方式相当于默认初始化。也许this 我的回答可能有助于理解每个含义。如果没有,请询​​问。
    • @Als:感谢您的链接。我走上了正轨。也许您对这个问题的回答可能会有所帮助。为什么编译器不能生成第一个示例代码中的 ctor default initialize const 对象?
    • @LinuxPenseur - 编译器生成的构造函数不会初始化 C 语言未初始化的类型。如果是这样,C++ 将在整个互联网上失去大量的 C 基准。
    猜你喜欢
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2011-09-14
    • 2015-12-03
    • 2021-07-31
    • 2012-01-17
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多