其他分享
首页 > 其他分享> > C 11左值,右值和std :: move()

C 11左值,右值和std :: move()

作者:互联网

我有以下代码:

#include <iostream>
using namespace std;
void test(int& a) {
    cout << "lvalue." << endl;
}
void test(int&& a) {
    cout << "rvalue" << endl;
}
int main(int argc, char *argv[]) {
    int a = 1;
    int&& b = 2;
    test(a);
    test(1);
    test(std::move(a));
    test(b);
}

哪个输出:

lvalue.
rvalue
lvalue.
lvalue.

std :: move()和int&&是rvalue引用,我想知道为什么测试(std :: move(a))和test(b)输出左值?它与签名匹配和函数重载有关吗?

解决方法:

输出应该是:

lvalue.
rvalue
rvalue
lvalue.

在rvalues和类型为rvalue引用的表达式之间存在非常重要的区别. b的类型是对int的rvalue引用,但表达式b是左值;它是一个变量,你可以把它的地址.这就是输出的最后一行是左值而不是右值的原因.要将其更改为右值,您应该在其上调用std :: move:

test(std::move(b));

标签:rvalue,c,c11,overload-resolution
来源: https://codeday.me/bug/20190724/1526031.html