gpt4 book ai didi

C++0x 嵌套初始化列表

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:42 25 4
gpt4 key购买 nike

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

最佳答案

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

The lifetime of the array is the same as that of the initializer_list object.

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

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

vector<string> v {"foo"};

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

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

关于C++0x 嵌套初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5840810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com