在下面的代碼中,爲什麼不首先撥打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。術語「右值引用」中的「右值」一詞描述了*引用*的類型:右值引用是綁定到右值的引用,並且左值引用是綁定到左值(大部分)的引用。在這個意義上,右值引用是一種新的語言功能,它爲語言增加了一種通用的右值到左值的轉換,但迄今爲止還沒有這種轉換。 –