c++ 0x嵌套初始化器列表

C++0x nested initializer lists

本文关键字:列表 初始化 嵌套 0x c++      更新时间:2023-10-16

我想使用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和递归来构建重复字符串的列表,并最终通过常量(例如,enum)以某种方式访问它。但是我甚至不能像这样嵌套初始化列表

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

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

(在return语句中创建临时对象,然后按值返回。即使发生了复制省略,复制的所有其他语义也不会改变。

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

vector<string> v {"foo"};

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

v.insert(v.end(), 3, "bar");