c – 返回std :: initializer_list在clang
参见英文答案 >
lifetime of a std::initializer_list return value2
考虑这个代码示例: #include <initializer_list> #include <iostream> int main() { for(auto e: []()->std::initializer_list<int>{return{1,2,3};}()) std::cout<<e<<std::endl; return 0; } 我试图用g(gcc版本4.9.2(Debian 4.9.2-10))编译它) 0 2125673120 32546 其中第一行始终为0,最后两行为“随机”. 这是cl ang还是别的东西?我认为这个代码示例是正确的. 更新: 当lambda函数返回类型是别的(例如std :: vector或std :: array)时,这段代码工作正常. 解决方法
从C 11 8.5.4列表初始化[dcl.init.list]:
您的lambda的return语句初始化一个临时std :: initializer_list< int>并返回其副本.这一切都很好,除了其引用的数组的生命期在完整表达式的结尾结束.通过lambda以外的initializer_list访问死亡数组会导致未定义的行为. initializer_list不是容器,它是对临时容器的引用.如果你试图像一个容器一样使用它,你将会有一个糟糕的时间. 在C 14(引用N4140)第6段中澄清:
通过CWG issue 1290的解决方案.这个澄清使得不可能使用initializer_list作为例如C 11的意图的成员变量.然而,即使在C14中,您的程序也有未定义的行为. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |