C ++ 11:是否可以从函数返回std :: initializer_list?

时间:2017-09-16 09:11:22

标签: c++11 stdinitializerlist

以下作品:

struct A {
  int i;
  int v;
};

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

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

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

但是,如果我将成员v更改为向量,则它不起作用:

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

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

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

我知道标准说复制initializer_list时不会复制底层对象。这是发生在这里的事吗?

为什么它在第一个例子中起作用?好运吗?当列表中的对象包含向量时,它是否特殊?

1 个答案:

答案 0 :(得分:1)

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

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