从我阅读和看到的内容来看,您无法将作为右值的表达式绑定到左值引用。但是,我看到的是可以将右值绑定到右值引用,并且由于命名的右值引用本质上是左值,因此可以将其绑定到左值引用。不允许将右值绑定到左值引用的原因是什么?是否出于优化目的?
举个例子:
#include <iostream>
using std::cout;
void bar ( int& b ) {
cout << "bar " << b << "\n";
b = 3;
}
void foo ( int&& a ) {
cout << a << "\n";
bar(a);
cout << a << "\n";
}
int main ( int argc, char ** argv ) {
foo(1);
}
这是C ++的基本规则,它可以防止错误:
int foo();
int& x = 3; // whoops
int& y = foo(); // whoops (sometimes)
至少部分地创建了“ Rvalue引用”(一组类型;不要与实际的rvalue混淆),以便在您确实想要执行以下操作时仍可以执行此操作:
int&& x = 3; // oh, go on then *sigh*
int&& y = foo(); // you'd better be sure!
在前面的示例中,我将rvalue表达式“引用”的对象绑定(或尝试绑定)到引用。
现在,我将由左值表达式命名的对象绑定到引用:
int i = foo();
int& x = i; // no problem michael
并且要确保您确实打算从左值表达式中获取右值引用,并引入了难以置信的名称不佳的名称std::move
:
int&& x = std::move(i); // doesn't move anything
这些后来的规则远比最初的基本规则晚了很多,而过去的基本规则无疑在过去的20年中避免了许多错误。
注意,Visual Studio中历来公认的T& x = bar()
,其中T
是一个用户定义的类型; 去搞清楚。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句