2011-04-30 64 views
6

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

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和递归来构建重复字符串列表,最后通过常量(例如枚举)以某种方式访问​​它。但似乎我甚至无法像这样嵌套初始化器列表。

回答

8

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

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

(临时在return语句创建,然后通过返回值,即使复制省略情况发生,复制的所有其他语义不变。)

比较,例如,临时initializer_list创建这里,然后将其传递到构造函数和对象初始化之后被破坏,在相同的点在相同的全表达的所有其他的临时对象(如果存在的话)将被破坏:

vector<string> v {"foo"}; 

代替操纵的初始化器列表,使用向量的方法插入N个拷贝:

v.insert(v.end(), 3, "bar"); 
相关问题