C++ 理解C++;编译程序

C++ 理解C++;编译程序,c++,compiler-construction,compiler-errors,most-vexing-parse,C++,Compiler Construction,Compiler Errors,Most Vexing Parse,可能重复: 我有这个简单的C++问题让我想重新开始我的CS学位,这次尝试学习一些东西。p> 此代码无法编译的原因: vector<int> v(int()); v.push_back(1); 向量v(int()); v、 推回(1); 而另一个编译时没有任何警告 vector<int> v((int())); v.push_back(1); 向量v((int()); v、 推回(1); 甚至很难找到区别(额外添加了括号:p)。这被称为最令人烦恼的解析 vecto

可能重复:

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

此代码无法编译的原因:

vector<int> v(int());
v.push_back(1);
向量v(int()); v、 推回(1); 而另一个编译时没有任何警告

vector<int> v((int()));
v.push_back(1);
向量v((int()); v、 推回(1);
甚至很难找到区别(额外添加了括号:p)。

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

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

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


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

实际上它是一个函数声明。如果你希望CS的等级能让你精通C++的复杂性,那么我认为你的期望值是错误的。像这样愚蠢的胡说八道总是可以在以后找到答案的(比如等等),但如果你不知道如何设计一棵树,那又有什么好处呢?请参见:-可能应该作为一个副本关闭?