【发布时间】:2018-02-25 09:22:31
【问题描述】:
以下作品:
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 时,是否有特殊情况?
【问题讨论】:
-
g++ 说
In function 'std::initializer_list<A> getList()': warning: returning temporary 'initializer_list' does not extend the lifetime of the underlying array [-Winit-list-lifetime]
标签: c++ c++11 return-value stdinitializerlist