关于const限定符和构造函数的问题

Pra*_*lla 2 c++ constructor const

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

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();                                                                                                                                                   
}                                                                                                                             
Run Code Online (Sandbox Code Playgroud)

GMa*_*ckG 6

这确实是不合理的.第8.5节/ 9:

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

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

struct foo {};

int main()
{
    const foo f;
}
Run Code Online (Sandbox Code Playgroud)

这个想法很简单:常量需要初始化为某些东西.如果没有用户定义的构造函数,则表示没有初始化.