6

我想使用 C++0x 新的初始化程序列表功能来初始化 std::vector ,并为我目前正在处理的新 API 使用编译时定义的项目数。像这样的东西:

template<int n>
std::initializer_list<std::string> duplicate(std::string s) {
  // return s duplicated n times
  return { s, s, s };
}

std::vector<std::string> v = { "foo",  duplicate<3>("bar") };

你知道如何做到这一点吗?甚至可能吗?我知道我需要使用 TMP 和递归来建立重复字符串的列表,并最终通过常量(例如,枚举)以某种方式访问​​它。但似乎我什至不能像这样嵌套初始化列表。

4

1 回答 1

8

您不能嵌套初始化列表来扩展它们,也不能添加/连接它们。它们只是访问编译时大小的数组的一点语法糖。即使复制 initializer_lists 也不会复制它们的项目。最重要的是,这意味着您不能使用重复的返回值!当函数返回时,引用的数组被销毁,根据 N3290 中的 8.5.4p6:

数组的生命周期与 initializer_list 对象的生命周期相同。

(在return语句中创建一个临时值,然后按值返回。即使发生复制省略,所有其他复制语义都不会改变。)

例如,与此处创建的临时 initializer_list 相比,然后将其传递给 ctor 并在对象初始化后销毁,在同一点,同一完整表达式中的所有其他临时对象(如果有的话)将被销毁:

vector<string> v {"foo"};

不用操作初始化列表,而是使用向量的方法插入 N 个副本:

v.insert(v.end(), 3, "bar");
于 2011-04-30T09:45:47.640 回答