C++ 11 lvalue,rvalue和std :: move()

Sim*_*LIU 4 c++ rvalue overload-resolution c++11

我有以下代码:

#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);
}
Run Code Online (Sandbox Code Playgroud)

哪个输出:

lvalue.
rvalue
lvalue.
lvalue.
Run Code Online (Sandbox Code Playgroud)

std::move()并且int&&是右值参考,我想知道为什么test(std::move(a))test(b)输出lvalue?它与签名匹配和函数重载有关吗?

Tar*_*ama 9

输出应该是:

lvalue.
rvalue
rvalue
lvalue.
Run Code Online (Sandbox Code Playgroud)

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

test(std::move(b));
Run Code Online (Sandbox Code Playgroud)