嗨,我有一个简单的问题 - 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 循环的底层代码和赋值/构造语句之间有什么区别?谢谢!
正如您所观察到的,
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
}
旁注:
转发参考涉及到完美转发的问题。查看更多相关信息这里。