【问题标题】:Question regarding const qualifier and constructor关于 const 限定符和构造函数的问题
【发布时间】:2010-10-29 15:50:23
【问题描述】:

这是一个简单的程序。 如果我评论构造函数,我会得到一个错误 只是想看看这是什么原因?

t.cc: In function 'int main(int, char**)':                                                                                                                              
t.cc:26: error: uninitialized const 'const_test'


#include <iostream>                                                                                                                                                     

using namespace std;                                                                                                                                                    

class TestPrint                                                                                                                                                         
{                                                                                                                                                                       
public:                                                                                                                                                                 
  //  TestPrint() {}                                                                                                                                                    
  void Print()                                                                                                                                                          
  {                                                                                                                                                                     
    std::cout << "TestPrint" << std::endl;                                                                                                                              
  }                                                                                                                                                                     

  void Print() const                                                                                                                                                    
  {                                                                                                                                                                     
    std::cout << "const TestPrint" << std::endl;                                                                                                                        
  }                                                                                                                                                                     
};                                                                                                                                                                      


int main(int argc, char* argv[])                                                                                                                                        
{                                                                                                                                                                       
  TestPrint normal_test;                                                                                                                                                
  normal_test.Print();                                                                                                                                                  

  const TestPrint const_test;                                                                                                                                           
  const_test.Print();                                                                                                                                                   
}                                                                                                                             

【问题讨论】:

  • 我做到了!又是这样 --> t.cc: In function 'int main(int, char**)': t.cc:26: error: uninitialized const 'const_test'
  • Visual Studio 2005 中没有错误
  • 哦..好的。我在 ubuntu 上遇到 g++ (4.4) 错误
  • 在这种情况下似乎 g++ 输了。
  • @Sheen:不。像往常一样,MSVC 输了。

标签: c++ constructor constants


【解决方案1】:

确实格式不正确。 §8.5/9:

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

强调我的。任何不为您的程序发出诊断的编译器都是不合规的(查看您的 MSVC)。一个更简单的测试:

struct foo {};

int main()
{
    const foo f;
}

这个想法很简单:常量需要被初始化为某种东西。如果你没有用户定义的构造函数,你就没有初始化。

【讨论】:

  • 您的示例格式错误的原因不是因为缺少用户声明的默认构造函数,而是因为缺少结构的大括号括起来的初始化程序。请注意,struct foo 是一个 POD 结构,不需要构造函数。
  • @wbb:我不打算将其视为 if-and-only-if。
【解决方案2】:

根据 ISO 标准(8.5 [dcl.init] 第 9 段):

如果没有为对象指定初始化器,并且该对象属于 (可能是 cv 限定的)非 POD 类类型(或其数组), 对象应默认初始化;如果对象是 const 限定类型,基础类类型应具有 用户声明的默认构造函数。

所以 GCC 就在这里。对不起,VC们。

【讨论】:

  • 别抱歉。我们可以忍受它。 :D
  • @Sheen:开个玩笑。这还不是最糟糕的问题。 =)
【解决方案3】:

一个 const 限定的对象必须在它定义的地方被初始化;通过初始化程序(例如const TestPrint const_test = TestPrint();)或通过默认构造函数。此规则适用于所有对象,即使它们没有任何要初始化的数据成员。

因此,如果没有默认构造函数,您的代码格式不正确;有了它就可以了,使用默认构造函数进行初始化。

【讨论】:

    【解决方案4】:

    您的代码在 Microsoft Visual Studio 2008 中编译。也许这是您的编译器的错误,您使用的是什么编译器?

    【讨论】:

      猜你喜欢
      • 2014-06-13
      • 2011-06-08
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多