🌟 C++11 が左辺値と右辺値を5分類に拡張した理由

📌 この記事は Zenn に投稿した内容のアーカイブです。 はじめに C++11 で「右辺値参照(rvalue reference)」が導入されたことで、C++ の値分類(value category)は大きく進化しました。 C++98 では「左辺値(lvalue)」と「右辺値(rvalue)」の二分法しかありませんでしたが、C++11 ではさらに細かく分類されます: C++11で導入された新しい概念である xvalue(期限切れ右辺値) と prvalue(純粋右辺値) が、 この章の中核的な進化ポイントです。 C++98 時代の「単純な世界」 C++98 の時代はとてもシンプルでした。 左辺値 (lvalue) :代入の左側に置けるもの。永続的なアドレスを持つ。 例:a, *ptr, array[i] 右辺値 (rvalue) :一時的な値。すぐに破棄される。 例:a + 5, 42, func() ルールも直感的でした: int a = 3; &a; // OK 左辺値はアドレスが取れる &(a + 5); // エラー!右辺値はアドレスが取れない しかしこの単純さが、性能の壁 になっていました。 問題:無駄なコピーが多すぎる std::vector<int> create_vector() { std::vector<int> temp; temp.push_back(1); temp.push_back(2); temp.push_back(3); return temp; // ここで何が起こる? } std::vector<int> v = create_vector(); C++98 の仕様では return temp; で コピーが発生 します。 temp のヒープメモリをまるごと複製し、呼び出し側に返すのです。 ...

2025年10月27日 · 2 分 · 319 文字 · Wuyukwi