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