c++ 0x嵌套初始化器列表
C++0x nested initializer lists
我想使用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");
相关文章:
- 复制列表初始化的隐式转换的等级是多少
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C++11 中的混合列表初始化
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++20 从括号中的值列表初始化聚合,不支持内部数组
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 默认参数和空列表初始化
- 如何在列表初始化中放置额外的语句?
- C++列表初始化允许多个用户定义的转换
- 列表初始化是否将原子初始化为零
- 使用可变模板列表初始化数组,并放置new
- 使用整数初始化列表初始化长双精度的向量
- 直接列表初始化的自动规则
- 使用初始化列表初始化unique_ptr的容器,继续
- 如何修复"非聚合无法使用初始值设定项列表初始化" <map>
- 直接列表初始化和复制列表初始化之间的差异
- 为什么我可以在不使用赋值运算符的情况下使用列表初始化普通数组
- C++ - 使用类中的初始值设定项列表初始化动态集