トップページ > プログラム > 2014年11月30日 > qLRyV8Wk

書き込み順位&時間帯一覧

21 位/260 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000000000004105



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
C++相談室 part114

書き込みレス一覧

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

ありがとうございます。かなり理解できました。

ただ、まだ誤解をしている部分がありそうなので(頭の悪い初心者は
信じられない解釈を・・・)、言葉の意味をもう少し掘り下げてみます。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。