c++ - 为什么我可以在 C++ 中使用 for 循环将右值绑定到非 const 引用?
问题描述
以下的逻辑让我感到困惑。它编译正常,但结果foo
是一个右值。这是暂时的。为什么我可以获取对容器中项目的非恒定引用?
#include <array>
std::array<int,3> foo(){
return std::array<int,3>{0,1,2};
}
int main(){
for(int & item: foo())
item = 0;
}
解决方案
基于范围的 for 循环具有以下语法
attr(optional) for ( init-statement(optional)range_declaration : range_expression ) loop_statement
它扩展到
{
init-statement
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
如您所见,右值的生命周期延长了__range
,因此将左值引用__range
绑定到集合中是有效的。循环结束后,__range
将超出范围破坏已创建的右值对象。
这就是为什么即使您正在修改注定要被销毁的对象,它也能工作的原因。
推荐阅读
- google-cloud-platform - 谷歌云 TPU 出现紧急错误
- react-native - 如何在本机反应中登录 Twitter 应用程序而不是 Safari 网络?
- mongodb - MongoDB:如何在聚合上应用多个 $project
- function - 在 Makefile 中导出函数
- php - 在 Mongodb + php 中查找两个日期之间的数据
- c++ - 标准互斥锁或增强互斥锁?哪个更可取?
- php - PHP / MySQL - MySQL 查询对每个特定列的结果进行排序
- .net - Angular 6 和 .net Core API 在同一个项目中使用 Visual Studio IDE Angular 模板
- node.js - 如何使用 WebSockets、Nodejs 实现 PM2 集群
- clion - 如何使用 CLION 方便地创建库(比如点击运行按钮)?