C++编译器为什么会混淆"默认构造函数"和"无参数的函数声明"该如何处理
C++编译器为什么会混淆"默认构造函数"和"无参数的函数声明"?
如下代码:
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
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);