代码之家  ›  专栏  ›  技术社区  ›  bradgonesurfing

为什么我可以在C++中使用for循环将右值绑定到非const引用?

  •  0
  • bradgonesurfing  · 技术社区  · 4 年前

    下面的逻辑让我很困惑。它编译得很好,但结果是 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;
    }
    
    
    1 回复  |  直到 4 年前
        1
  •  4
  •   NathanOliver    4 年前

    这个 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 ,因此将左值引用到集合中是有效的 __范围 一旦循环结束, __范围 将超出范围,销毁创建的右值对象。

    这就是为什么即使你正在修改一个注定要被销毁的对象,它仍然有效。

    推荐文章