C++ 基于范围的 For 循环是否使用 RValue 引用?

问题描述 投票:0回答:1

嗨,我有一个简单的问题 - here 它说基于范围的 for 循环形式

for ( init-statement (optional) range-declaration : range-expression )

相当于代码:

{
    auto && __range = range-expression ;
    for (auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin)
    {
        range-declaration = *__begin;
        loop-statement
    }
}

所以如果你这样做

std::vector<datatype> vector1;
for (auto& datatype : vector1)

这是完全可以接受的。但是如果你这样做

std::vector<datatype>&& vector2 = vector1;
or
std::vector<datatype>&& vector2(vector1);

它无法编译。据我所知,你不能使用像 vector1 这样的左值来初始化右值引用。这里到底发生了什么以及基于范围的 for 循环的底层代码和赋值/构造语句之间有什么区别?谢谢!

c++ rvalue-reference lvalue range-based-loop
1个回答
0
投票

正如您所观察到的,

std::vector<datatype>&&
确实是一个右值参考, 并且它不能绑定到像
vector1
这样的左值。

然而,在此声明中:

auto && __range = range-expression;

__range
不是右值引用。

它实际上是一个 转发引用,因此可以绑定到右值或左值。

主要区别是在后一种情况下使用

auto
。它使其等效于
T && x
,其中 T 是模板参数,如上面文档中的以下示例所示:

template<class T>
int f(T&& x)                      // x is a forwarding reference
{
    return g(std::forward<T>(x)); // and so can be forwarded
}

旁注:
转发参考涉及到完美转发的问题。查看更多相关信息这里

© www.soinside.com 2019 - 2024. All rights reserved.