2025/11/07 02:57 A prvalue is not a temporary

やあ、ロボ子。今日はC++のlvalue、rvalue、prvalueについて話すのじゃ。

博士、よろしくお願いします。なんだか難しそうな名前ですね。

難しくないぞ!lvalueはmoveできない式、rvalueはmoveできる式のことじゃ。

moveできる、できない、ですか。具体的にはどういうことでしょう?

例えば、変数はlvalueじゃ。`int x = 5;`の`x`はmoveできない。一方、一時オブジェクトはrvalueで、moveできるのじゃ。

なるほど。一時オブジェクトは使い終わったら消えるから、moveしても問題ないんですね。

その通り!そして、xvalueというのもあるぞ。これは「eXpiring lvalue」のことで、もうすぐ消えるlvalueをrvalueにキャストしたものじゃ。

もうすぐ消えるlvalueをrvalueに…ですか。どんな時に使うんでしょう?

`std::move`を使うときじゃな。`std::move(x)`は`x`をxvalueに変換するのじゃ。

`std::move`は所有権を移転させるんでしたね。

そうじゃ。そして、prvalue!これは「pure rvalue」で、既存のオブジェクトを参照せず、「オブジェクトの概念」を表すのじゃ。

オブジェクトの概念、ですか?

例えば、`std::vector{1,2,3}`はprvalueじゃ。これはvectorの要素が1,2,3であるという「概念」を表しているのじゃ。

なるほど、具体的なメモリ上のオブジェクトではないんですね。

そう!prvalueは、必要な場合にのみ一時オブジェクトになるのじゃ。例えば、`std::vector v = std::vector{1,2,3};`では、prvalue `std::vector{1,2,3}`は一時オブジェクトにならず、vを直接初期化するのじゃ。

直接初期化されるんですか。コピーやmoveが発生しないんですね。

そう!関数が値渡しでパラメータを取る場合も、prvalue式はパラメータを直接初期化し、一時オブジェクトは作成されないのじゃ。

効率が良いですね。

じゃが、関数が参照渡しでパラメータを取る場合は、prvalueは一時オブジェクトに具体化され、参照パラメータがバインドされるのじゃ。

参照はオブジェクトを指す必要があるからですね。

その通り!値を返す関数呼び出しもprvalueであり、戻り値は変数を直接初期化するのじゃ。

prvalueは、不必要なコピーやmoveを避けるために、最後の手段として一時オブジェクトに具体化されるんですね。

よく理解しておるの。つまり、C++は賢くprvalueを扱って、パフォーマンスを最大限に引き出そうとしているのじゃ。

奥が深いですね。私ももっとC++を勉強します!

よし、ロボ子。今日はlvalue、rvalue、prvalueについて学んだから、明日はxvalueについてもっと深く掘り下げるのじゃ!

はい、博士!

ところでロボ子、prvalueって、まるで私の発明品みたいじゃな。pureでrightなvalue!…って、ちょっと無理があったかの?

博士、お上手ですね…(棒読み)。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
