我遇到了一个简单的 C++ 问题,这让我想重新开始我的 CS 学位,这次尝试学习一些东西。;)
为什么这段代码不能编译:
vector<int> v(int());
v.push_back(1);
而另一个编译时没有任何警告
vector<int> v((int()));
v.push_back(1);
甚至很难找到不同之处(添加了额外的括号:P)。
我遇到了一个简单的 C++ 问题,这让我想重新开始我的 CS 学位,这次尝试学习一些东西。;)
为什么这段代码不能编译:
vector<int> v(int());
v.push_back(1);
而另一个编译时没有任何警告
vector<int> v((int()));
v.push_back(1);
甚至很难找到不同之处(添加了额外的括号:P)。
它被称为最令人头疼的解析。
vector<int> v(int());
声明一个函数,该函数v
接受一个函数(不接受返回 a 的参数int
)并返回 a vector<int>
。这会自动“调整”为接受指向函数v
的指针(不接受返回 an 的参数int
)并返回 a的函数vector<int>
。
额外的一对括号抑制了这种解释,因为您不能在函数声明中的参数声明符周围放置额外的括号,因此(int())
只能将其解释为名为 的对象的初始值设定项v
。
int()
C++ 有一个明确的消歧规则,如果它使句法(但不一定是语义)有意义,则更喜欢将事物(在这种情况下)解析为声明符而不是表达式。
实际上它是一个函数声明。见:http ://www.gotw.ca/gotw/075.htm