C++ 关于常量限定符和构造函数的问题

C++ 关于常量限定符和构造函数的问题,c++,constructor,constants,C++,Constructor,Constants,下面是一个简单的程序。 如果我注释构造函数,我会得到一个错误 我只是想看看是什么原因 t.cc: In function 'int main(int, char**)': t.cc:26: error: uninitialized const 'c

下面是一个简单的程序。 如果我注释构造函数,我会得到一个错误 我只是想看看是什么原因

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:intmain(int,char**)函数中:
t、 抄送:26:错误:未初始化常量“常量测试”
#包括
使用名称空间std;
类测试打印
{                                                                                                                                                                       
公众:
//TestPrint(){}
作废打印()
{                                                                                                                                                                     

std::cout您的代码在Microsoft Visual Studio 2008中编译。这可能是您的编译器的一个错误,您使用的编译器是什么?

常量限定对象必须在其定义的位置进行初始化;或者由初始化器进行初始化(例如
const TestPrint const\u test=TestPrint();
),或默认构造函数。此规则适用于所有对象,即使它们没有任何要初始化的数据成员


因此,如果没有默认构造函数,您的代码是格式错误的;有了它,代码就可以了,默认构造函数用于初始化。

它确实格式错误。§8.5/9:

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

强调我的观点。任何没有为您的程序发出诊断的编译器都是不符合要求的(看看您的MSVC)。更简单的测试:

struct foo {};

int main()
{
    const foo f;
}

想法很简单:常量需要初始化为某些内容。如果没有用户定义的构造函数,就没有初始化。

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

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


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

我做到了!又来了-->t.cc:在函数“int main(int,char**)”中“:t.cc:26:error:uninitialized const'const_test'visualstudio 2005Oh中没有错误..好的。我在g++(4.4)中遇到了一个错误在ubuntuSeems上,g++在这种情况下会失败。@Sheen:不会。和往常一样,MSVC会失败。别难过。我们可以接受它D@Sheen:只是开玩笑。这不是有史以来最糟糕的问题。=)您的示例格式不正确的原因不是因为缺少用户声明的默认构造函数,而是因为缺少结构的括号内初始值设定项。请注意,
struct foo
是一个POD结构,它不需要构造函数。@wbb:我不想把它当作if和only if。