最令人烦恼的解析阻止 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);
};

但这仍然让我们两次命名。