首页 > 解决方案 > 在 lambda 中复制 initilizer_list 是否合法?

问题描述

请考虑这个简化的 C++14 程序:

#include <vector>
#include <iostream>

int main()
{
    auto l12 = {1,2};
    auto copy = []( auto v ) { return v; };
    std::vector<int> v{ copy( l12 ) };
    std::cout << v[0] << ' ' << v[1] << '\n';
}

GCC 在这里发出警告:

warning: returning local 'initializer_list' variable 'v' does not extend the lifetime of the underlying array [-Winit-list-lifetime]
    7 |     auto copy = []( auto v ) { return v; };

而其他编译器接受该程序:https ://gcc.godbolt.org/z/PPrsWxbfM

您能否说一下程序是否格式错误或 GCC 警告是错误的?

标签: c++lambdac++14initializer-list

解决方案


它格式良好,没有UB。

auto l12延长临时数组的生命周期,并使其保持活动状态直到main. auto v并且 lambda 的返回值不扩展任何东西,但只要它还l12活着就不是问题。


但总的来说,我不建议使用std::initializer_list函数参数以外的任何东西,因为棘手的生命周期扩展规则。


推荐阅读