最令人烦恼的解析阻止 in-class 初始化 std::vector<int>
most vexing parse prevents in-class initializing a std::vector<int>
C++11 允许 in-class 初始化:
struct Foo{
std::vector<std::string> v{3}; // vector of 3 empty strings
};
如果我们想在-class 中初始化一个 ints 的向量,我们会得到其他东西:
struct Foo{
std::vector<int> v{3}; // vector of one element with value 3
};
这个问题似乎是语言的限制,。但是,如果这不是 in-class 初始化,我们将能够使用圆括号而不是大括号,并获得所需的结果:
std::vector<int> v(3); // vector of three zeros
但是,我们无法在 class 中执行此操作,因为 most vexing parse:
struct Foo{
std::vector<int> v(3); // most vexing parse; doesn't compile
};
当然,上面的代码是否是好的设计实践是值得商榷的,因为我们可以轻松地将我们正在尝试做的事情移到构造函数中。但是暂时把它放在一边,有没有办法执行所需的初始化,尽可能接近第一个 std::string
示例,它可以正常工作?
默认成员初始值设定项也适用于 =
。所以
struct Foo{
std::vector<int> v = std::vector<int>(3);
};
会做的。很明显,一个主要的警告是我们在这里重复了类型名称。
我们可以通过 decltype
稍微缓解一下:
struct Foo{
std::vector<int> v = decltype(v)(3);
};
但这仍然让我们两次命名。
C++11 允许 in-class 初始化:
struct Foo{
std::vector<std::string> v{3}; // vector of 3 empty strings
};
如果我们想在-class 中初始化一个 ints 的向量,我们会得到其他东西:
struct Foo{
std::vector<int> v{3}; // vector of one element with value 3
};
这个问题似乎是语言的限制,
std::vector<int> v(3); // vector of three zeros
但是,我们无法在 class 中执行此操作,因为 most vexing parse:
struct Foo{
std::vector<int> v(3); // most vexing parse; doesn't compile
};
当然,上面的代码是否是好的设计实践是值得商榷的,因为我们可以轻松地将我们正在尝试做的事情移到构造函数中。但是暂时把它放在一边,有没有办法执行所需的初始化,尽可能接近第一个 std::string
示例,它可以正常工作?
默认成员初始值设定项也适用于 =
。所以
struct Foo{
std::vector<int> v = std::vector<int>(3);
};
会做的。很明显,一个主要的警告是我们在这里重复了类型名称。
我们可以通过 decltype
稍微缓解一下:
struct Foo{
std::vector<int> v = decltype(v)(3);
};
但这仍然让我们两次命名。