lvalueとrvalueとmoveと
valueをxvalueとprvalueに分解して理解する必要はあるのか
いいやない。このまとめはxvalueとprvalueとlvalueのはざまで混乱しもがいたC++erの軌跡である。
(注意:のっけからdisりで始まっていますが、それが主題ではないことにご注意ください。)
きっかけ

実践C++入門講座、はっきり言ってlvalueとrvalueの説明を無駄に難しくしたせいで21回の説明が破綻しかないのが辛い。「容器は左辺値、値は右辺値」って違うでしょ・・・。そもそもC++11のlvalueとrvalueの説明をしなかった時点で破綻 @TheorideTech
2017-06-26 00:16:28実践C++入門講座6回目 左辺値・右辺値は演算子で決まる!! | Theolizer®
実践C++入門講座 第21回目 コンストラクタの誤解と一時オブジェクト | Theolizer®
この記事の説明に違和感を覚えたことから話は始まる。

lvalueとrvalueの差は明確だよ、名前があるかないか、それだけだ。すべてオブジェクト(容器)には違いない、しかし名前がない、これはrvalueだ。参照による寿命延長とかもこれだと説明がいらない。極めてシンプルになる。 twitter.com/yumetodo/statu…
2017-06-26 00:17:47
そりゃ厳密にはrvalueにもいろいろあるけど、プログラム書く上で意識することは名前の有無に絞っていいでしょ。 twitter.com/yumetodo/statu…
2017-06-26 00:18:42
operatorをlvalue/rvalueで分類とか一体いつ役に立つんだ・・・ twitter.com/yumetodo/statu…
2017-06-26 00:20:49xvalueとprvalueと一時オブジェクトという言葉の闇

@yumetodo lvalue, rvalueの説明はまだしてないですよ。古き良き時代の左辺値、右辺値は容器と値で良いし、単純で解りやすいと思います。 xvalueの概念はmoveのためにあるのでクラスを説明しないと必要性を説明できないのですよ。
2017-06-26 00:26:56
@yumetodo C++11のlvalue,rvalueを説明する時、xvalueを避けて通れないので先延ばしてしてます。
2017-06-26 00:37:17
@TheorideTech 最初からC++11ので説明していれば1-3.一時オブジェクトは左辺値? 右辺値?なんて節そのものが不要なので破綻してますね。 きめた。今度Qiitaに記事かこう。
2017-06-26 00:45:12
@yumetodo 一時オブジェクト=xvalueと思うけどxvalueって難解な概念です。 xvalueはglvalueでありrvalueでもあります。あの節は、その辺を匂わせたかったのですよ。
2017-06-26 00:49:50
@TheorideTech いや、そもそもrvalueを分解して教える必要性に疑問符を投げざるをえないですね。規格書リーディングがしたいんじゃなくてコードを書きたいんじゃないんかい、と。
2017-06-26 00:53:18
@yumetodo 最終的には右辺値参照に持っていきたいのですよ。高速なコードを書くために必要な概念ですから。右辺値参照って要するに一時オブジェクトへの参照と理解してます。
2017-06-26 00:55:00
@yumetodo ちょっと違った。持っていきたいのはmoveです。 相手が一時オブジェクトだからmoveできるって話ですね。
2017-06-26 00:58:26
@yumetodo 一時オブジェクトじゃないものをmoveしたらダメなのでは? そして、std::moveは通常のオブジェクトを一時オブジェクトとして扱っていいって許可するようなものと理解してます。 異論はあるかもしれない。
2017-06-26 01:00:43
@TheorideTech 反例 std::vector<int> v1 = { 2, 32 };//v1は断じて一時オブジェクトではない auto v2 = std::move(v);//しかしmoveできる
2017-06-26 01:02:49
@yumetodo いやだから、std::moveは普通のオブジェクトを一時オブジェクトとして扱って良いと言うプログラマからコンパイラへの許可だと思います。
2017-06-26 01:03:57
@TheorideTech @yumetodo ムーブは一時オブジェクト云々ではなく、所有権の移動を表しているだけでは? 一時オブジェクトは常に破壊可能だから所有権の移動がデフォルトになっているだけだと思う
2017-06-26 01:06:15
@kazatsuyu @TheorideTech >std::moveは普通のオブジェクトを一時オブジェクトとして扱って良いと言う たかがキャストでそんな司令は出せない
2017-06-26 01:07:39
@kazatsuyu @yumetodo 所有権の移動を許可するために、一時オブジェクトを装ってると理解してます。 xvalue=一時オブジェクトと言う理解はあってます? 消える値だから移動して良いという考えです。
2017-06-26 01:08:47
@TheorideTech @kazatsuyu >xvalue=一時オブジェクトと言う理解はあってます? ちがうのでは、prvalueは一時オブジェクトではないとでも?
2017-06-26 01:11:22