为什么我可以在 C++ 中使用 for 循环将右值绑定到非常量引用?
Why can I bind rvalues to non const reference with a for loop in C++?
下面的逻辑让我很困惑。它编译正常,但 foo
的结果是一个右值。这是一个临时的。为什么允许我获得对容器中项目的非常量引用?
#include <array>
std::array<int,3> foo(){
return std::array<int,3>{0,1,2};
}
int main(){
for(int & item: foo())
item = 0;
}
range based for loop 的语法为
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
将超出范围并销毁创建的右值对象。
这就是为什么即使您正在修改一个注定要被销毁的对象,它也能正常工作的原因。
下面的逻辑让我很困惑。它编译正常,但 foo
的结果是一个右值。这是一个临时的。为什么允许我获得对容器中项目的非常量引用?
#include <array>
std::array<int,3> foo(){
return std::array<int,3>{0,1,2};
}
int main(){
for(int & item: foo())
item = 0;
}
range based for loop 的语法为
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
将超出范围并销毁创建的右值对象。
这就是为什么即使您正在修改一个注定要被销毁的对象,它也能正常工作的原因。