读书人

C++编译器为什么会混淆quot;默认构造函数quot;

发布时间: 2012-05-21 18:04:41 作者: rapoo

C++编译器为什么会混淆"默认构造函数"和"无参数的函数声明"?
如下代码:

C/C++ code
class x{    int i;public:    x():i(23){}    x(int ii):i(ii){}};int main(){    x x1();  //编译器混淆了ctor和函数    x x2(24);//这个编译器就不会把ctor和函数混淆    return 0;}


VC10编译会提示: “x x1(void)”: 未调用原型函数(是否是有意用变量定义的?)
我想知道,难道是C++标准规定的,如果采用默认构造函数,必须"不可以"带一个空的括号? 否则当成函数的声明来处理?


[解决办法]
我只想问一句,如果x x1()意为“定义一个变量x1,类型为x,使用默认构造函数”
那么该怎么定义“名为x1的函数,无输入参数,返回值为x类型”


[解决办法]
没理解
x x1()应该是函数吧.... “名为x1的函数,无输入参数,返回值为x类型”

[解决办法]
x x1();应该写成x x1;
[解决办法]
明明是人弄混淆了一些东西,却说成编译器弄混淆了一些东西,这是很不好的习惯
[解决办法]
x x1(); //编译器混淆了ctor和函数

这句是函数签名。
[解决办法]
>我想知道,难道是C++标准规定的,如果采用默认构造函数,必须"不可以"带一个空的括号? 否则当成函数的声明来处理?
是。C++其中的一个蛋疼之处:most vexing parse。这个会规定用x x1();写的必须按照函数声明来处理。
[解决办法]
x():i(23);是声明
[解决办法]
这个嘛, 不是因为编译器太笨而"混淆", 即使聪明如人类, 也会混淆啊.
C/C++ code
x x1();
[解决办法]
这是C++兼容C的结果。
x x1();如果这是默认构造,那么怎么表示x1是函数声明?

[解决办法]
同时这样也和原始类型/内建类型保持语法一致。
int i;
x x1;

int i(5);
x x1(24);

读书人网 >C++

热点推荐