2017-06-01 43 views
1

我已經做了簡單的測試以瞭解更好的移動語義。輸出結果對我而言是意外的。貝婁是我的測試功能:爲左值移動語義

template<class T> 
void test(T&& v) 
{ 
    v++; 
} 

void main() 
{ 
    int v = 1; 
    test(std::move(v)); 
    std::cout << "Output:" << v << std::endl; 
} 

我的期望是: 輸出:1 但真正的結果是: 輸出:2

我認爲如下 - 我使用std ::移動(V),因爲我已經轉換爲「右值」,並且測試函數將與時態變量一起工作。因此結果應該是輸出:1. 我的結論有什麼問題?

+1

void main不符合C++標準。 – 2017-06-01 12:45:31

+0

'std :: move'的名字被嚴重挑選出來,這可能會讓你感到困惑。它並沒有實際移動任何東西。它只是將一個左值賦予一個右值,使得*可能*做出一個移動。 –

回答

0

std::move永遠不會構造一個臨時的。這是一個轉換爲右值參考。

該參考文件綁定到main::v,則test::v參數用它初始化,因此也綁定到main::v

如果你想創建一個臨時的,使用強制:

test(int{v}); 
0

爲了幫助您瞭解什麼類型的模板推斷,您可以使用宏__PRETTY_FUNCTION__

template<class T> 
void test(T&& v) 
{ 
    std::cout<< __PRETTY_FUNCTION__ << std::endl; 
    v++; 
} 

而且這個傢伙的解釋很多關於模板扣除的事情(你的情況在35')

https://www.youtube.com/watch?v=vwrXHznaYLA