最烦恼的解析防止在类中初始化std :: vector <int>

时间:2018-02-10 16:33:50

标签: c++ c++11 constructor initialization most-vexing-parse

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示例执行所需的初始化,哪个没问题?

1 个答案:

答案 0 :(得分:6)

默认成员初始值设定项也适用于=。所以

struct Foo{
    std::vector<int> v = std::vector<int>(3);
};

会这样做。虽然很明显,但一个重要的警告是我们在这里重复类型名称。

我们可以使用decltype来缓解它:

struct Foo{
    std::vector<int> v = decltype(v)(3);
};

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