矢量 - 对统一初始化

时间:2017-03-10 06:22:49

标签: c++ c++11 stdvector std-pair list-initialization

我有一个定义为 -

的集合
using Parameters = std::vector<int>;
using Group = std::pair<std::string, Parameters>;
std::vector<Group> inputs;

我的意图是使用像

这样的陈述
inputs.push_back(group0 /*What goes in here ?*/);
inputs.push_back(group1 /*What goes in here ?*/);

如何使用初始化列表初始化group0group1? 像这样的代码似乎无法正常工作

inputs.push_back(std::make_pair("group0", {1, 2, 3, 4}));

编辑: 已存在关于向量对初始化的问题,但我无法看到second的{​​{1}}再次成为集合。

2 个答案:

答案 0 :(得分:10)

当你写inputs.push_back(std::make_pair("group0", {1, 2, 3, 4}))时,你要求make_pair推断出两个论点的类型。但第二个参数, braced-init-list ,不是表达式,因此它没有类型。因此,模板参数推断失败。

最简单的解决方案是删除对make_pair的调用,并在任何地方使用 braced-init-lists

inputs.push_back({"group0", {1, 2, 3, 4}});

现在,列表初始化将enumerate available constructors并使用外部参数对调用pair构造函数,并使用内部 braced-init-list的vector构造函数

答案 1 :(得分:1)

虽然

inputs.push_back({"group0", {1, 2, 3, 4}});

正确地适用于您打算做的事情,我认为使用它更具表现力:

inputs.push_back(std::make_pair("group0", Parameters{1, 2, 3, 4}));