roy*_*roy 6 c++ initializer-list template-meta-programming c++11
我想使用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") };
Run Code Online (Sandbox Code Playgroud)
你知道怎么做到这一点吗?它甚至可能吗?我知道我将需要使用TMP和递归来构建重复字符串列表,并最终通过常量(例如,枚举)以某种方式访问它.但似乎我甚至无法像这样嵌套初始化列表.
您不能嵌套初始化列表以扩展它们,也不能添加/连接它们.它们只是访问编译时大小数组的一些语法糖.即使复制initializer_lists也不会复制其项目.最重要的是,这意味着你不能使用重复的返回值!函数返回时,引用的数组将被销毁,在N3290中为8.5.4p6:
数组的生命周期与initializer_list对象的生命周期相同.
(在return语句中创建临时,然后按值返回.即使发生复制省略,复制的所有其他语义也不会改变.)
例如,与此处创建的临时initializer_list相比较,然后将其传递给ctor并在初始化对象后销毁,同一点上同一完整表达式中的所有其他临时对象(如果有的话)将被销毁:
vector<string> v {"foo"};
Run Code Online (Sandbox Code Playgroud)
而不是操纵初始化列表,使用vector的方法插入N个副本:
v.insert(v.end(), 3, "bar");
Run Code Online (Sandbox Code Playgroud)