我想知道有一个右值引用变量(不是作为函数参数)是否有意义?我理解右值引用在用作函数变量时的使用,因为这样可以避免不必要的分配等。但是是否存在不是函数参数的用例右值引用变量?一开始我以为有了这样的变量,我们可以捕获作为右值传入的数据供以后使用,但似乎如果我们有一个右值引用变量,那么我们已经可以获取它的地址,因此它不能再是右值引用了。

我尝试了以下代码,它(不出所料)无法编译。那么为什么我想要一个右值引用变量呢?

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

如果您不使用 paramstd::move 转换为右值引用,那么您不会将 param 移动到 member 中,您只需复制它(如果 param 是可复制的,否则您会收到编译时错误),因为 param 本身是一个左值。希望这能澄清它。

关于c++ - 右值引用成员变量有什么用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30291349/

10-15 00:31