gpt4 book ai didi

c++ - 是否可以从函数返回 std::initializer_list ?

转载 作者:行者123 更新时间:2023-12-01 14:44:37 26 4
gpt4 key购买 nike

以下作品:

struct A {
int i;
int v;
};

std::initializer_list<A> getList() {
return {A{0,1}, A{2,3}};
}

int main() {
auto list = getList();
}

我可以验证列表的内容是否正确。

但是,如果我将成员 v 更改为 std::vector,它将不起作用:

struct A {
int i;
std::vector<int> v;
};

std::initializer_list<A> getList() {
return {A{0,{1,2}}, A{3,{4,5}}};
}

在这种情况下,返回的列表包含垃圾值。

我知道标准规定,复制 std::initializer_list 时不会复制底层对象。这是这里发生的事情吗?

为什么它在第一个示例中有效?是运气吗?当列表中的对象包含 std::vector 时,情况有什么特别吗?

最佳答案

返回initializer_list可以编译,但它很少做正确的事情。该列表是一个临时值,initializer_list 对象指向它。它是一个悬空指针。

在第一个示例中,应用了优化,因为列表是常量表达式。它不是被写入临时存储,而是静态全局。然而,标准中并未指定这种优化。返回值起作用,只是未定义行为的一种形式。

关于c++ - 是否可以从函数返回 std::initializer_list ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46252185/

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