<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cpp11 on Wuyukwi's Notebook</title><link>https://wuyukwi.duckdns.org/tags/cpp11/</link><description>Recent content in Cpp11 on Wuyukwi's Notebook</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Mon, 27 Oct 2025 14:31:00 +0900</lastBuildDate><atom:link href="https://wuyukwi.duckdns.org/tags/cpp11/index.xml" rel="self" type="application/rss+xml"/><item><title>🌟 C++11 が左辺値と右辺値を5分類に拡張した理由</title><link>https://wuyukwi.duckdns.org/posts/zenn-bdadcd1b03c135/</link><pubDate>Mon, 27 Oct 2025 14:31:00 +0900</pubDate><guid>https://wuyukwi.duckdns.org/posts/zenn-bdadcd1b03c135/</guid><description>&lt;blockquote&gt;
&lt;p&gt;📌 &lt;em&gt;この記事は &lt;a href="https://zenn.dev/wuyukwi/articles/bdadcd1b03c135"&gt;Zenn&lt;/a&gt; に投稿した内容のアーカイブです。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;C++11 で「右辺値参照（rvalue reference）」が導入されたことで、C++ の値分類（value category）は大きく進化しました。&lt;br&gt;
C++98 では「左辺値（lvalue）」と「右辺値（rvalue）」の二分法しかありませんでしたが、C++11 ではさらに細かく分類されます：&lt;/p&gt;
&lt;p&gt;C++11で導入された新しい概念である&lt;br&gt;
&lt;strong&gt;xvalue（期限切れ右辺値）&lt;/strong&gt; と &lt;strong&gt;prvalue（純粋右辺値）&lt;/strong&gt; が、&lt;br&gt;
この章の中核的な進化ポイントです。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="c98-時代の単純な世界"&gt;C++98 時代の「単純な世界」&lt;/h2&gt;
&lt;p&gt;C++98 の時代はとてもシンプルでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;左辺値 (lvalue)&lt;/strong&gt; ：代入の左側に置けるもの。永続的なアドレスを持つ。&lt;br&gt;
例：&lt;code&gt;a&lt;/code&gt;, &lt;code&gt;*ptr&lt;/code&gt;, &lt;code&gt;array[i]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;右辺値 (rvalue)&lt;/strong&gt; ：一時的な値。すぐに破棄される。&lt;br&gt;
例：&lt;code&gt;a + 5&lt;/code&gt;, &lt;code&gt;42&lt;/code&gt;, &lt;code&gt;func()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ルールも直感的でした：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int a = 3;
&amp;amp;a; // OK 左辺値はアドレスが取れる
&amp;amp;(a + 5); // エラー！右辺値はアドレスが取れない
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;しかしこの単純さが、&lt;strong&gt;性能の壁&lt;/strong&gt; になっていました。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="問題無駄なコピーが多すぎる"&gt;問題：無駄なコピーが多すぎる&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;std::vector&amp;lt;int&amp;gt; create_vector() {
std::vector&amp;lt;int&amp;gt; temp;
temp.push_back(1);
temp.push_back(2);
temp.push_back(3);
return temp; // ここで何が起こる？
}
std::vector&amp;lt;int&amp;gt; v = create_vector();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C++98 の仕様では &lt;code&gt;return temp;&lt;/code&gt; で &lt;strong&gt;コピーが発生&lt;/strong&gt; します。&lt;br&gt;
&lt;code&gt;temp&lt;/code&gt; のヒープメモリをまるごと複製し、呼び出し側に返すのです。&lt;/p&gt;</description></item></channel></rss>