我有这个简单的C ++问题,这让我想重新尝试重新学习CS学位,这次尝试学习一些东西。 ;)
为什么此代码无法编译:
vector<int> v(int());
v.push_back(1);
而另一个编译没有一个警告
vector<int> v((int()));
v.push_back(1);
甚至很难找到差异(增加了额外的括号:P)。
答案 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