在下面的代码中,为什么不首先拨打mkme = mvme_rv
发送到T& operator=(const T&&)
?为什么我必须调用右值引用?
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using T = vector<int>;
int main()
{
T mvme(10, 1), mkme;
T&& mvme_rv = move(mvme); // rvalue ref?
mkme = mvme_rv; // calls T& operator=(const T&)?
cout << mvme.empty(); // 0
mkme = move(mvme_rv); // calls T& operator=(const T&&)?
cout << mvme.empty(); // 1
}
'mvme_rv'的类型是对'T'的右值引用,但是当通过名称使用该变量时,它只不过是一个左值。 – skypjack
区分“右值参考”和“右值”。 –
命名表达式总是lvlaues。术语“右值引用”中的“右值”一词描述了*引用*的类型:右值引用是绑定到右值的引用,并且左值引用是绑定到左值(大部分)的引用。在这个意义上,右值引用是一种新的语言功能,它为语言增加了一种通用的右值到左值的转换,但迄今为止还没有这种转换。 –