理解C++编译器

Ern*_*jal 5 c++ compiler-construction compiler-errors most-vexing-parse

可能重复:
最令人烦恼的解析:为什么不是A a(()); 工作?

我有这个简单的C++问题,这让我想重新尝试重新学习CS学位,这次尝试学习一些东西.;)

为什么这段代码不能编译:

vector<int> v(int());
v.push_back(1);
Run Code Online (Sandbox Code Playgroud)

而另一个编译没有一个警告

vector<int> v((int()));
v.push_back(1);
Run Code Online (Sandbox Code Playgroud)

甚至很难找到差异(增加了额外的括号:P).

CB *_*ley 9

它被称为最令人烦恼的解析.

vector<int> v(int());
Run Code Online (Sandbox Code Playgroud)

声明一个函数v,它接受一个函数(不带参数返回int)并返回一个vector<int>.这会自动"调整"为一个函数v,该函数接受一个函数指针(不返回参数int)并返回一个vector<int>.

额外的括号对禁止这种解释,因为您不能在函数声明中的参数声明符周围放置额外的括号,因此(int())只能将其解释为名为的对象的初始值设定项v.

C++有一个明确的消歧规则,int()如果它产生语法(但不一定是语义)意义,它更倾向于将事物(在这种情况下)解析为声明符而不是表达式.