是否可以从函数中 return a std::initializer_list?
Is it possible to return a std::initializer_list from a function?
以下作品:
struct A {
int i;
int v;
};
std::initializer_list<A> getList() {
return {A{0,1}, A{2,3}};
}
int main() {
auto list = getList();
}
我可以验证list的内容是正确的
但是,如果我将成员 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
对象指向它。它是一个悬挂指针。
在您的第一个示例中,应用了优化,因为列表是常量表达式。它不是写入临时存储,而是静态全局。但是,该优化并未在标准中指定。 return 值有效,只是未定义行为的一种形式。
以下作品:
struct A {
int i;
int v;
};
std::initializer_list<A> getList() {
return {A{0,1}, A{2,3}};
}
int main() {
auto list = getList();
}
我可以验证list的内容是正确的
但是,如果我将成员 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
对象指向它。它是一个悬挂指针。
在您的第一个示例中,应用了优化,因为列表是常量表达式。它不是写入临时存储,而是静态全局。但是,该优化并未在标准中指定。 return 值有效,只是未定义行为的一种形式。