【发布时间】:2018-07-21 05:43:04
【问题描述】:
C++11 允许类内初始化:
struct Foo{
std::vector<std::string> v{3}; // vector of 3 empty strings
};
如果我们想在类内初始化一个 ints 的向量,我们会得到别的东西:
struct Foo{
std::vector<int> v{3}; // vector of one element with value 3
};
这个问题似乎是语言的限制,as discussed in previous questions。但是,如果这不是类内初始化,我们将能够使用括号而不是大括号,并获得所需的结果:
std::vector<int> v(3); // vector of three zeros
但是,由于most vexing parse,我们不能在课堂上这样做:
struct Foo{
std::vector<int> v(3); // most vexing parse; doesn't compile
};
当然,上面的代码是否是好的设计实践还有待商榷,因为我们可以很容易地将我们正在尝试做的事情转移到构造函数中。但是暂时把它放在一边,有没有办法执行所需的初始化,尽可能接近第一个 std::string 示例,这没有问题?
【问题讨论】:
-
std::vector<int> v(3);如何是最令人头疼的解析的示例?我无法理解。顺便说一句,涉及最烦人的解析 确实的代码可以编译;只是它的含义与您的预期不同。 -
这不是最麻烦的解析。语言根本不允许这样做。
-
@Nawaz:
std::vector<int> v(3);在类定义中不能在 C++11 中编译,如上面的struct Foo。 -
@xdavidliu:我的问题是,最令人头疼的解析是怎样的?你什么时候得到的?
-
@Nawaz 我的印象是
std::vector<int> v(3);在类声明中不会编译,因为编译器无法判断我们是在尝试声明成员向量v还是声明函数名称为v。我的印象是这个问题被称为“最令人烦恼的解析”。您能告诉我其中哪一部分不正确吗?
标签: c++ c++11 constructor initialization most-vexing-parse