萌えハッカーニュースリーダー

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

出典: https://blog.knatten.org/2025/10/31/a-prvalue-is-not-a-temporary/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

効率が良いですね。

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

はい、博士!

hakase
博士

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

roboko
ロボ子

博士、お上手ですね…(棒読み)。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search