我想使用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");