5

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

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

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

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

而另一个编译时没有任何警告

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

甚至很难找到不同之处(添加了额外的括号:P)。

4

2 回答 2

9

它被称为最令人头疼的解析。

vector<int> v(int());

声明一个函数,该函数v接受一个函数(不接受返回 a 的参数int)并返回 a vector<int>。这会自动“调整”为接受指向函数v指针(不接受返回 an 的参数int)并返回 a的函数vector<int>

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

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

于 2012-01-24T13:38:04.313 回答
1

实际上它是一个函数声明。见:http ://www.gotw.ca/gotw/075.htm

于 2012-01-24T13:44:16.683 回答