c++ - 为什么我可以在 C++ 中使用 for 循环将右值绑定(bind)到非常量引用?

标签 c++ range-based-loop

下面的逻辑让我很困惑。它编译正常,但 foo 的结果是一个右值。这是暂时的。为什么我可以获取对容器中项目的非恒定引用?

https://godbolt.org/z/vEafrE

#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 绑定(bind)到的集合中是有效的。循环结束后,__range 将超出范围并销毁创建的右值对象。

这就是为什么即使您正在修改注定要被销毁的对象,它仍然可以工作。

关于c++ - 为什么我可以在 C++ 中使用 for 循环将右值绑定(bind)到非常量引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66209918/

相关文章:

c++ - 如何查找是否以及不带括号的语句?

c++ - 在 Ubuntu 上的 Visual Studio 代码中编译 C++

c++ - 基于范围的 for 循环,第一项的特殊情况

c++ - 从字符串中提取字符时,基于范围的循环和stringstream有什么区别

c++ - QPainterPath 和 QPoint 之间的最短距离

c++ - QMediaPlayer 支持哪些音频格式?

C++ vector 打印出奇怪的元素

C++ 循环遍历 map

c++ - for循环的两个代码有什么不同?

c++ - 使用 For 循环填充 Makefile 变量