- C++相談室 part114
705 :デフォルトの名無しさん[]:2014/11/30(日) 21:16:41.33 ID:qLRyV8Wk - class A{
string str_; public: A(string s):str_(s){} ・・・ A& operator=(const A& rhs){・・・} A& operator=(A&& rhs) { if (this != &rhs) { str_=std::move(rhs).str_; //(1) } return *this; } (1)の部分が、gcc4.8.1では通ります.正しくは str_=std::move(rhs.str_); のようですが, オブジェクトrhs自体を右辺値にするとまずいの でしょうか?
|
- C++相談室 part114
709 :デフォルトの名無しさん[]:2014/11/30(日) 21:23:06.93 ID:qLRyV8Wk - >>705
すみません.class Aに対する}; が抜けてました.
|
- C++相談室 part114
711 :デフォルトの名無しさん[]:2014/11/30(日) 21:35:52.51 ID:qLRyV8Wk - >>710
ありがとうございます。 str_=std::move(rhs.str_); だとrhsオブジェクトのstr_メンバのみが右辺値になるだけで、 rhsオブジェクト自体は右辺値にならないのではないか?オブジェクトrhsを右辺値にするには、 str_=std::move(rhs).str_;とすべきではないか?と思ったものですから。 まだ、std::moveに対する理解が足りないのかもしれません。
|
- C++相談室 part114
713 :デフォルトの名無しさん[]:2014/11/30(日) 21:58:51.00 ID:qLRyV8Wk - >>712
試していただいてありがとうございます。左辺値になってしまうのですか。 オブジェクトを右辺値参照で受け取っている時点でrhsオブジェクトは名前「rhs」 がついているにせよ、廃棄される運命にある。 ただし、str_=rhs.str_; とすると、データメンバrhs.str_が左辺値となってしまう ので、rhsオブジェクトも廃棄されなくなってしまう。 の解釈でどうでしょうか? しかし、何か混乱してきました。
|
- C++相談室 part114
716 :デフォルトの名無しさん[]:2014/11/30(日) 22:22:39.29 ID:qLRyV8Wk - >>714
ありがとうございます。かなり理解できました。 ただ、まだ誤解をしている部分がありそうなので(頭の悪い初心者は 信じられない解釈を・・・)、言葉の意味をもう少し掘り下げてみます。
|