lvalueとrvalueとmoveと

やっぱりrvalueを分解してxvalueとprvalueを議論する意味は規格書の重箱の隅をつつく以外の意味はない気がする。右辺値とか左辺値とか一時オブジェクトとか消えゆく値とかいう怪しげな言葉を投げ捨てましょう。
3

valueをxvalueとprvalueに分解して理解する必要はあるのか

いいやない。このまとめはxvalueとprvalueとlvalueのはざまで混乱しもがいたC++erの軌跡である。

(注意:のっけからdisりで始まっていますが、それが主題ではないことにご注意ください。)

きっかけ

yumetodo @yumetodo

実践C++入門講座、はっきり言ってlvalueとrvalueの説明を無駄に難しくしたせいで21回の説明が破綻しかないのが辛い。「容器は左辺値、値は右辺値」って違うでしょ・・・。そもそもC++11のlvalueとrvalueの説明をしなかった時点で破綻 @TheorideTech

2017-06-26 00:16:28
yumetodo @yumetodo

lvalueとrvalueの差は明確だよ、名前があるかないか、それだけだ。すべてオブジェクト(容器)には違いない、しかし名前がない、これはrvalueだ。参照による寿命延長とかもこれだと説明がいらない。極めてシンプルになる。 twitter.com/yumetodo/statu…

2017-06-26 00:17:47
yumetodo @yumetodo

そりゃ厳密にはrvalueにもいろいろあるけど、プログラム書く上で意識することは名前の有無に絞っていいでしょ。 twitter.com/yumetodo/statu…

2017-06-26 00:18:42
yumetodo @yumetodo

operatorをlvalue/rvalueで分類とか一体いつ役に立つんだ・・・ twitter.com/yumetodo/statu…

2017-06-26 00:20:49
yumetodo @yumetodo

名前がないものは式の終了と同時に死ぬ、以上だ。 twitter.com/yumetodo/statu…

2017-06-26 00:23:56

xvalueとprvalueと一時オブジェクトという言葉の闇

Theolizer @TheorideTech

@yumetodo lvalue, rvalueの説明はまだしてないですよ。古き良き時代の左辺値、右辺値は容器と値で良いし、単純で解りやすいと思います。 xvalueの概念はmoveのためにあるのでクラスを説明しないと必要性を説明できないのですよ。

2017-06-26 00:26:56
Theolizer @TheorideTech

@yumetodo C++11のlvalue,rvalueを説明する時、xvalueを避けて通れないので先延ばしてしてます。

2017-06-26 00:37:17
Theolizer @TheorideTech

@yumetodo でも、21回目が破綻してみえましたか。失敗失敗。何処かで見直します。

2017-06-26 00:40:48
yumetodo @yumetodo

@TheorideTech 最初からC++11ので説明していれば1-3.一時オブジェクトは左辺値? 右辺値?なんて節そのものが不要なので破綻してますね。 きめた。今度Qiitaに記事かこう。

2017-06-26 00:45:12
Theolizer @TheorideTech

@yumetodo 一時オブジェクト=xvalueと思うけどxvalueって難解な概念です。 xvalueはglvalueでありrvalueでもあります。あの節は、その辺を匂わせたかったのですよ。

2017-06-26 00:49:50
yumetodo @yumetodo

@TheorideTech いや、そもそもrvalueを分解して教える必要性に疑問符を投げざるをえないですね。規格書リーディングがしたいんじゃなくてコードを書きたいんじゃないんかい、と。

2017-06-26 00:53:18
Theolizer @TheorideTech

@yumetodo 最終的には右辺値参照に持っていきたいのですよ。高速なコードを書くために必要な概念ですから。右辺値参照って要するに一時オブジェクトへの参照と理解してます。

2017-06-26 00:55:00
Theolizer @TheorideTech

@yumetodo ちょっと違った。持っていきたいのはmoveです。 相手が一時オブジェクトだからmoveできるって話ですね。

2017-06-26 00:58:26
yumetodo @yumetodo

@TheorideTech なんかそれもおかしいな・・・

2017-06-26 00:58:55
Theolizer @TheorideTech

@yumetodo 一時オブジェクトじゃないものをmoveしたらダメなのでは? そして、std::moveは通常のオブジェクトを一時オブジェクトとして扱っていいって許可するようなものと理解してます。 異論はあるかもしれない。

2017-06-26 01:00:43
yumetodo @yumetodo

@TheorideTech 反例 std::vector<int> v1 = { 2, 32 };//v1は断じて一時オブジェクトではない auto v2 = std::move(v);//しかしmoveできる

2017-06-26 01:02:49
Theolizer @TheorideTech

@yumetodo いやだから、std::moveは普通のオブジェクトを一時オブジェクトとして扱って良いと言うプログラマからコンパイラへの許可だと思います。

2017-06-26 01:03:57
白山風露 @kazatsuyu

@TheorideTech @yumetodo ムーブは一時オブジェクト云々ではなく、所有権の移動を表しているだけでは? 一時オブジェクトは常に破壊可能だから所有権の移動がデフォルトになっているだけだと思う

2017-06-26 01:06:15
yumetodo @yumetodo

@kazatsuyu @TheorideTech >std::moveは普通のオブジェクトを一時オブジェクトとして扱って良いと言う たかがキャストでそんな司令は出せない

2017-06-26 01:07:39
Theolizer @TheorideTech

@kazatsuyu @yumetodo 所有権の移動を許可するために、一時オブジェクトを装ってると理解してます。 xvalue=一時オブジェクトと言う理解はあってます? 消える値だから移動して良いという考えです。

2017-06-26 01:08:47
Theolizer @TheorideTech

@yumetodo @kazatsuyu 型でムーブやコピーを制御しているから、できますよ。

2017-06-26 01:09:28
yumetodo @yumetodo

@TheorideTech @kazatsuyu >xvalue=一時オブジェクトと言う理解はあってます? ちがうのでは、prvalueは一時オブジェクトではないとでも?

2017-06-26 01:11:22
1 ・・ 7 次へ