2013-05-04 10 views
7

ちょうど私が種類基準を理解していると思ったとき、私はこの問題に遭遇しました。コードはおそらく不必要に長いかもしれませんが、そのアイデアは非常に簡単です。 main()関数とreturnRValueRef()関数があります。rvalue参照による返品はどのように機能しますか?

#include <iostream> 

#define NV(x) "[" << #x << "=" << (x) << "]" 
#define log(x) cout << __FILE__ << ":" << __LINE__ << " " << x << endl 

using namespace std; 

class AClass { 
public: 
    int a_; 

    AClass() : a_(0) { 
    log("inside default constructor"); 
    } 
    AClass(int aa) : a_(aa) { 
    log("inside constructor"); 
    } 
    int getInt() const { 
    return a_; 
    } 
    void setInt(int a) { 
    a_ = a; 
    } 

    AClass(AClass const & other) : a_(other.a_) { 
    log("inside copy constructor"); 
    } 

    AClass & operator=(AClass const & rhs) { 
    log("inside assignment operator" << "left value" << NV(a_) << "right value" << NV(rhs.a_)); 
    a_ = rhs.a_; 
    return *this; 
    } 

    AClass & operator=(AClass && rhs) { 
    log("inside assignment operator (rvalue ref)" << "left" << NV(a_) << "right" << NV(rhs.a_)); 
    a_ = rhs.a_; 
    return *this; 
    } 
}; 

AClass && returnRValueRef() { 
    AClass a1(4); 
    return move(a1); 
} 

int main() { 
    AClass a; 
    a = returnRValueRef(); 
} 

さて、Iは、(A1ため)、次いで「内部コンストラクタ」(A用)、及びrhs.a_ = 4と次に代入演算子メッセージ「デフォルトコンストラクタ内部」最初の印刷にこのコードを期待するだろうが出力は、誰かが、出力プリントright[rhs.a_=0]の代わりright[rhs.a_=4]に、なぜ最後の行を説明でき

testcpp/return_rvalue_ref.cpp:14 inside default constructor 
testcpp/return_rvalue_ref.cpp:17 inside constructor 
testcpp/return_rvalue_ref.cpp:39 inside assignment operator (rvalue ref)left[a_=0]right[rhs.a_=0] 

のですか?私は、その動きは、その内容を変更することなく、左辺値を右辺値に変換すると思った。しかし、私は明らかに何かが欠けている。

ありがとうございました。 :-)

編集:私は何が起こっているのか知っていると思います。関数returnRValueRef()のデストラクタが、範囲外になったとき(たとえrvalueになっても)呼び出された後に、a1(またはその値参照)のメモリ位置に未定義のものが含まれている可能性があります。起こっていることは確かではありませんが、そう考えられます。

答えて

18

なお、評価基準はまだ参考になっています。あなたの場合、破壊されたローカル変数を参照しています。したがって、メンバーにアクセスするのは未定義の動作です。あなたのコメントのための

AClass returnRValueRef() { 
    AClass a1(4); 
    return a1; 
} 
+0

ありがとう:何がやりたいことは、オブジェクトを返すことです:あなたは本当にこれだけを行う必要があるので、

AClass returnRValueRef() { AClass a1(4); return move(a1); } 

しかし、この動きは、ローカル変数で自動的に行われます。あなたがあなたのコメントを追加している間、私はその質問を編集しました、あなたが言ったようなものが問題です。ありがとう。 (申し訳ありませんが、あなたの答えをアップアップすることはできませんが、あまりにも少ない点です。) –

+0

@ YogeshwerSharma:受け入れは素晴らしいでしょう、ありがとう! –

+0

rvalue参照による戻りが有用な例がありますか?そうではありませんか? :( –

関連する問題