最近我一直在嘗試理解移動語義並提出了一個問題。std :: forward實現之間的區別
該問題已被討論here。
我實現了第一個變種,並檢查其是否返回L值或R值:
#include <iostream>
using namespace std;
template <typename T>
T&& my_forward(T&& x) {
return static_cast<T&&> (x);
}
int main() {
int a = 5;
&my_forward(a); // l-value
return 0;
}
所以,如果我通過L值,則返回L值(編譯,因爲我可以如果我這樣做:
&my_forward(int(5)); // r-value with int&& type
我的代碼不編譯,因爲my_forward返回的r值。在上面的問題中,他們說這個實現和標準的區別(分別是std :: remove_reference和兩個不同的參數分別是&和& &)是我的實現始終返回l值,它會返回r值和l值。
所以我想知道,爲什麼我不能實現std :: forward像那樣?在哪些具體情況下會顯示標準版本之間的區別?另外,爲什麼我應該將T指定爲模板並且不能讓它使用參數類型來定義它自己?
你爲什麼試圖採取的右值引用地址? – xinaiz
@BlackMoses檢查r值。 – LogicStuff
@LogicStuff啊,好吧,以爲這是誤判'&'的用法:) – xinaiz