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。