c++ - 在 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 警告是错误的?
解决方案
它格式良好,没有UB。
auto l12
延长临时数组的生命周期,并使其保持活动状态直到main
. auto v
并且 lambda 的返回值不扩展任何东西,但只要它还l12
活着就不是问题。
但总的来说,我不建议使用std::initializer_list
函数参数以外的任何东西,因为棘手的生命周期扩展规则。
推荐阅读
- python - 在 shell 中将用户输入回显为“*”或类似的东西
- csv - JMeter:如何节省csv中每个线程的响应时间
- java - “冲突的字符串创建者:已经明确标记...”;创建者在哪里明确标记?
- regex - 从日志文件中提取特定的 XML
- python - Python中的Selenium Grid - 每次第一次测试后功能测试超时
- windows - 在没有本地管理员访问权限的情况下运行 Corda -CordaDemoBench
- typescript - 如何使用类型检查设置对象属性,但在更改时触发函数
- javascript - 数据表重新排序问题
- sql - 根据 SQL 中的唯一列标识符将行数据转置为一列
- python - 在 for 循环中加载数据后如何绘制 3 个子图