理解C ++编译器

时间:2012-01-24 13:35:34

标签: c++ compiler-construction compiler-errors most-vexing-parse

  

可能重复:
  Most vexing parse: why doesn't A a(()); work?

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

为什么此代码无法编译:

vector<int> v(int());
v.push_back(1);

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

vector<int> v((int()));
v.push_back(1);

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

2 个答案:

答案 0 :(得分:9)

这被称为最令人烦恼的解析。

vector<int> v(int());

声明一个函数v,它接受​​一个函数(不带参数返回int)并返回vector<int>。这会自动“调整”为函数v,该函数将指针指向函数(不带参数返回int)并返回vector<int>。< / p>

额外的一对括号禁止这种解释,因为你不能在函数声明中的参数声明符周围放置额外的括号,因此(int())只能被解释为名为v的对象的初始化器。

C ++有一个明确的消歧规则,它倾向于将事物(在本例中为int())解析为声明符而不是表达式,如果它使语法(但不一定是语义)有意义的话。

答案 1 :(得分:1)

确实是一个功能声明。请参阅:http://www.gotw.ca/gotw/075.htm