2017-06-01 7 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)、その結果、私は "rvalue"への変換があり、テスト関数は時間的変数で動作します。したがって、結果は出力する必要があります。1. 私の結論は間違っていますか?

+1

void mainがC++標準に準拠していません。 –

+0

'std :: move'の名前は悪く選ばれています。これはおそらくあなたを混乱させるでしょう。実際には何も動かない。それは左辺値を右辺値にキャストし、移動を可能にします*。 –

答えて

0

std::moveは一時的に構成しません。 rvalue-referenceへの変換です。

この参照は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

関連する問題