我想知道有一个右值引用变量(不是作为函数参数)是否有意义?我理解右值引用在用作函数变量时的使用,因为这样可以避免不必要的分配等。但是是否存在不是函数参数的用例右值引用变量?一开始我以为有了这样的变量,我们可以捕获作为右值传入的数据供以后使用,但似乎如果我们有一个右值引用变量,那么我们已经可以获取它的地址,因此它不能再是右值引用了。
我尝试了以下代码,它(不出所料)无法编译。那么为什么我想要一个右值引用变量呢?
void test(int&& a) {}
int&& a(22);
test(a);
谢谢!
最佳答案
此处的 a
是右值引用的名称。 a
本身是一个右值引用类型的左值(你可以获取它的地址)(是的,有点困惑)。因此,每当您将 a
传递给 test(a)
时,都会传递一个左值。将左值视为具有名称的任何对象,或者您可以稍后获取其地址。并且您不能将左值绑定(bind)到右值引用,因此编译错误
您需要通过 std::move(a)
。在这种情况下,您抛弃了 a
的左值。
请注意,在您的函数 a
内部也是一个左值(同样,您可以对其执行左值操作,例如获取其地址等)。任何时候您想将其用作右值时都需要强制转换 (std::move
)。例如,假设您有一个带有成员变量 Bar
的对象 Foo member;
,并且您想通过成员函数 f
移入它:
void Bar::f(Foo&& param)
{
member = std::move(param); // need std::move here to move param into member
}
// invoked it as
bar.f(std::move(some_foo)); // move some_foo into param
如果您不使用
param
将 std::move
转换为右值引用,那么您不会将 param
移动到 member
中,您只需复制它(如果 param
是可复制的,否则您会收到编译时错误),因为 param
本身是一个左值。希望这能澄清它。关于c++ - 右值引用成员变量有什么用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30291349/