C++编译器为什么会混淆"默认构造函数"和"无参数的函数声明"该如何处理

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);