右值引用成员变量有什么用

bim*_*bam 5 c++ rvalue rvalue-reference c++11

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

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

void test(int&& a) {}

int&& a(22);
test(a);
Run Code Online (Sandbox Code Playgroud)

谢谢!

vso*_*tco 5

a在这里是一个右值引用的名称。a本身是一个右值引用类型的左值(你可以获取它的地址)(是的,有点混乱)。因此,无论何时传递ato test(a),都会传递一个左值。将左值视为任何具有名称的对象,或者您可以稍后获取其地址。并且您不能将左值绑定到右值引用,因此编译错误

错误:无法将“int”左值绑定到“int&&”

你需要通过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
Run Code Online (Sandbox Code Playgroud)

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

  • 当您不再将对象视为左值或右值时,情况就更清楚了;_expressions_ 具有值类别,而不是它们命名(或未命名)的事物。 (3认同)