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
示例执行所需的初始化,哪个没问题?
答案 0 :(得分:6)
默认成员初始值设定项也适用于=
。所以
struct Foo{
std::vector<int> v = std::vector<int>(3);
};
会这样做。虽然很明显,但一个重要的警告是我们在这里重复类型名称。
我们可以使用decltype
来缓解它:
struct Foo{
std::vector<int> v = decltype(v)(3);
};
但这仍然让我们两次命名。