【问题标题】:Is it possible to return a std::initializer_list from a function?是否可以从函数返回 std::initializer_list ?
【发布时间】: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&lt;A&gt; getList()': warning: returning temporary 'initializer_list' does not extend the lifetime of the underlying array [-Winit-list-lifetime]

标签: c++ c++11 return-value stdinitializerlist


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 2014-10-23
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多