ちょうど私が種類基準を理解していると思ったとき、私はこの問題に遭遇しました。コードはおそらく不必要に長いかもしれませんが、そのアイデアは非常に簡単です。 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
(またはその値参照)のメモリ位置に未定義のものが含まれている可能性があります。起こっていることは確かではありませんが、そう考えられます。
ありがとう:何がやりたいことは、オブジェクトを返すことです:あなたは本当にこれだけを行う必要があるので、
しかし、この動きは、ローカル変数で自動的に行われます。あなたがあなたのコメントを追加している間、私はその質問を編集しました、あなたが言ったようなものが問題です。ありがとう。 (申し訳ありませんが、あなたの答えをアップアップすることはできませんが、あまりにも少ない点です。) –
@ YogeshwerSharma:受け入れは素晴らしいでしょう、ありがとう! –
rvalue参照による戻りが有用な例がありますか?そうではありませんか? :( –