Skip to content

Commit 9837fd5

Browse files
author
cpprefjp-autoupdate
committed
update automatically
1 parent ff0882b commit 9837fd5

File tree

3 files changed

+182
-2535
lines changed

3 files changed

+182
-2535
lines changed

lang/cpp26/nice_placeholder_with_no_name.html

Lines changed: 72 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@
2828
<meta property="og:url" content="https://cpprefjp.github.io/lang/cpp26/nice_placeholder_with_no_name.html" />
2929
<meta property="og:site_name" content="cpprefjp - C++日本語リファレンス" />
3030
<meta property="og:type" content="article" />
31-
<meta property="og:description" content="C++17で採用された、`[[maybe_unused]]`属性を変数名`_`の場合、自動的につける" />
31+
<meta property="og:description" content="C++26では、宣言だけして使用しない変数として、変数名`_`を特別扱いする" />
3232
<meta name="twitter:card" content="summary" />
3333
<meta name="twitter:title" content="宣言のみで使用しない変数の名前として_をサポート [P2169R4] - cpprefjp C++日本語リファレンス" />
3434
<meta name="twitter:url" content="https://cpprefjp.github.io/lang/cpp26/nice_placeholder_with_no_name.html" />
35-
<meta name="twitter:description" content="C++17で採用された、`[[maybe_unused]]`属性を変数名`_`の場合、自動的につける" />
35+
<meta name="twitter:description" content="C++26では、宣言だけして使用しない変数として、変数名`_`を特別扱いする" />
3636

3737

3838
<link rel="alternate" type="application/atom+xml" title="Atom" href="https://cpprefjp.github.io/rss.xml" />
@@ -68,7 +68,7 @@
6868

6969
</head>
7070
<body>
71-
<header data-kunai-mdinfo="{&#34;meta&#34;: {&#34;cpp&#34;: [&#34;cpp26&#34;]}, &#34;sources&#34;: [], &#34;page_id&#34;: [&#34;lang&#34;, &#34;cpp26&#34;, &#34;nice_placeholder_with_no_name&#34;]}">
71+
<header data-kunai-mdinfo="{&#34;meta&#34;: {&#34;cpp&#34;: [&#34;cpp26&#34;]}, &#34;sources&#34;: [{&#34;id&#34;: &#34;1bdad0861a25f90015e99357980a767a94a69b53&#34;, &#34;source&#34;: &#34;int main() {\n // gcc\u3084clang\u306e\u5834\u5408\u3001-Wall\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u3064\u3051\u308b\u3068\u3001\n // \u5909\u6570\u304c\u672a\u4f7f\u7528\u3060\u3063\u305f\u5834\u5408\u3001\u8b66\u544a\u304c\u51fa\u529b\u3055\u308c\u308b\u3002\n // [[maybe_unused]]\u5c5e\u6027\u306b\u3088\u3063\u3066\u3001\u3053\u308c\u3092\u6291\u5236\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u305f\u3002\n [[maybe_unused]] int hardNamingVariable;\n\n // \u3057\u304b\u3057\u3001\u4eca\u5f8c\u306f\u3001\u5909\u6570\u540d\u304c_\u3067\u3042\u308c\u3070\u3001\u81ea\u52d5\u7684\u306b\u305d\u306e\u5c5e\u6027\u304c\u9069\u7528\u3055\u308c\u308b\u3088\u3046\u306b\u306a\u308b\u3002\n // \u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092-Wall\u3067\u30b3\u30f3\u30d1\u30a4\u30eb\u3057\u3066\u3082\u3001\u8b66\u544a\u306f\u8868\u793a\u3055\u308c\u306a\u3044\u3002\n int _;\n}\n&#34;}], &#34;page_id&#34;: [&#34;lang&#34;, &#34;cpp26&#34;, &#34;nice_placeholder_with_no_name&#34;]}">
7272
<nav class="navbar navbar-default" role="navigation">
7373
<div class="container-fluid">
7474
<div class="navbar-header">
@@ -188,12 +188,12 @@
188188

189189
<p class="text-right"><small>
190190
最終更新日時(UTC):
191-
<span itemprop="datePublished" content="2024-12-20T13:46:53">
192-
2024年12月20日 13時46分53秒
191+
<span itemprop="datePublished" content="2024-12-21T01:43:29">
192+
2024年12月21日 01時43分29秒
193193
</span>
194194
<br/>
195195
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
196-
<span itemprop="name">rotarymars</span>
196+
<span itemprop="name">Akira Takahashi</span>
197197
</span>
198198
が更新
199199
</small></p>
@@ -218,21 +218,81 @@ <h1 itemprop="name"><span class="token">宣言のみで使用しない変数の
218218
<p>のちのC++規格でさらに変更される場合があるため<a href="#relative-page">関連項目</a>を参照してください。</p>
219219
<p></p>
220220
<h2>概要</h2>
221-
<p>C++17で採用された、<code>[[maybe_unused]]</code>属性を変数名<code>_</code>の場合、自動的につける。</p>
222-
<p><div class="codehilite"><pre><span></span><code><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
223-
<span class="p">[[</span><span class="n">maybe_unused</span><span class="p">]]</span><span class="kt">int</span> <span class="n">hardNamingVariable</span><span class="p">;</span>
221+
<p>C++26では、宣言だけして使用しない変数として、変数名<code>_</code>を特別扱いする。</p>
222+
<p>宣言だけして使用しない変数が必要な状況としては、以下のようなミューテックスのロック取得や、構造化束縛などがある:</p>
223+
<p><div class="codehilite"><pre><span></span><code><span class="c1">// C++23まで</span>
224+
<span class="n"><a href="../../reference/mutex/mutex.html">std::mutex</a></span> <span class="n">mux</span><span class="p">;</span>
225+
<span class="n"><a href="../../reference/tuple/tuple.html">std::tuple</a></span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">U</span><span class="p">,</span> <span class="n">V</span><span class="o">&gt;</span> <span class="n">f</span><span class="p">();</span>
226+
227+
<span class="kt">void</span> <span class="nf">f</span><span class="p">()</span> <span class="p">{</span>
228+
<span class="n">std</span><span class="o">::</span><span class="n">lock_gaurd</span> <span class="n">guard</span><span class="p">{</span><span class="n">mux</span><span class="p">};</span> <span class="c1">// デストラクタでの自動解放だけしたいのでguard変数はとくに使わない</span>
229+
<span class="k">auto</span> <span class="p">[</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">no_use</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span><span class="p">();</span> <span class="c1">// 構造化束縛した一部の変数は使わない</span>
230+
<span class="p">}</span>
231+
</code></pre></div>
232+
</p>
233+
<p>C++26では、変数名として<code>_</code><a href="../cpp17/maybe_unused.html"><code>[[maybe_unused]]</code>属性</a>が付加される、と規定される。</p>
234+
<p><div class="codehilite"><pre><span></span><code><span class="c1">// C++26</span>
235+
<span class="n"><a href="../../reference/mutex/mutex.html">std::mutex</a></span> <span class="n">mux</span><span class="p">;</span>
236+
<span class="n"><a href="../../reference/tuple/tuple.html">std::tuple</a></span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">U</span><span class="p">,</span> <span class="n">V</span><span class="o">&gt;</span> <span class="n">f</span><span class="p">();</span>
237+
238+
<span class="kt">void</span> <span class="nf">f</span><span class="p">()</span> <span class="p">{</span>
239+
<span class="n">std</span><span class="o">::</span><span class="n">lock_gaurd</span> <span class="n">_</span><span class="p">{</span><span class="n">mux</span><span class="p">};</span> <span class="c1">// OK</span>
240+
<span class="k">auto</span> <span class="p">[</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">_</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span><span class="p">();</span> <span class="c1">// OK</span>
241+
<span class="p">}</span>
242+
</code></pre></div>
243+
</p>
244+
<h2>仕様</h2>
245+
<ul>
246+
<li>
247+
<p>変数名<code>_</code>は、「名前非依存 (name independent) の宣言」という名称で扱われ、実装への推奨としては <code>[[maybe_unused]]</code>属性が自動的に付加され、使用されなくても警告は出力されない:
248+
<br />
249+
<div class="codehilite"><pre><span></span><code><span class="k">auto</span> <span class="n">_</span> <span class="o">=</span> <span class="n">foo</span><span class="p">();</span> <span class="c1">// [[maybe_unused]] auto _ = f(); と等価</span>
250+
</code></pre></div>
251+
</p>
252+
</li>
253+
<li>
254+
<p>変数名<code>_</code>は、以下の状況では再宣言できる:</p>
255+
<ul>
256+
<li>自動変数</li>
257+
<li>非静的メンバ変数</li>
258+
<li>構造化束縛</li>
259+
<li>ラムダ式のキャプチャでの導入子</li>
260+
</ul>
261+
</li>
262+
<li>再宣言された変数<code>_</code>を使用した場合、プログラムは<a class="cpprefjp-defined-word" data-desc="プログラムが適格でないこと。コンパイルエラーなどになる" href="../../implementation-compliance.html#dfn-ill-formed">不適格</a>となる</li>
263+
</ul>
264+
<p><div class="codehilite"><pre><span></span><code><span class="k">namespace</span> <span class="n">a</span> <span class="p">{</span>
265+
<span class="k">auto</span> <span class="n">_</span> <span class="o">=</span> <span class="n">f</span><span class="p">();</span> <span class="c1">// OK: "_"変数の宣言</span>
266+
<span class="k">auto</span> <span class="n">_</span> <span class="o">=</span> <span class="n">f</span><span class="p">();</span> <span class="c1">// エラー! "_"はこの名前空間ですでに定義されている</span>
267+
<span class="p">}</span>
268+
269+
<span class="kt">void</span> <span class="n">f</span><span class="p">()</span> <span class="p">{</span>
270+
<span class="k">auto</span> <span class="n">_</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span> <span class="c1">// OK: "_"変数の宣言</span>
271+
<span class="k">auto</span> <span class="n">_</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// OK: "_"変数の再宣言</span>
272+
<span class="p">{</span>
273+
<span class="k">auto</span> <span class="n">_</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// OK: シャドウイング</span>
274+
<span class="n"><a href="../../reference/cassert/assert.html">assert</a></span><span class="p">(</span><span class="n">_</span> <span class="o">==</span> <span class="mi">1</span><span class="p">);</span> <span class="c1">// OK</span>
275+
<span class="p">}</span>
276+
<span class="n"><a href="../../reference/cassert/assert.html">assert</a></span><span class="p">(</span> <span class="n">_</span> <span class="o">==</span> <span class="mi">42</span> <span class="p">);</span> <span class="c1">// 不適格: 再宣言されたプレースホルダー変数の使用</span>
277+
<span class="p">}</span>
278+
</code></pre></div>
279+
</p>
280+
<h2></h2>
281+
<p><div class="yata" id="1bdad0861a25f90015e99357980a767a94a69b53"><div class="codehilite"><pre><span></span><code><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
224282
<span class="c1">// gccやclangの場合、-Wallオプションをつけると、</span>
225283
<span class="c1">// 変数が未使用だった場合、警告が出力される。</span>
226284
<span class="c1">// [[maybe_unused]]属性によって、これを抑制することができた。</span>
285+
<span class="p">[[</span><span class="n">maybe_unused</span><span class="p">]]</span> <span class="kt">int</span> <span class="n">hardNamingVariable</span><span class="p">;</span>
286+
227287
<span class="c1">// しかし、今後は、変数名が_であれば、自動的にその属性が適用されるようになる。</span>
288+
<span class="c1">// 以下のコードを-Wallでコンパイルしても、警告は表示されない。</span>
228289
<span class="kt">int</span> <span class="n">_</span><span class="p">;</span>
229-
<span class="c1">// このコードを-Wallでコンパイルしても、警告は表示されない。</span>
230290
<span class="p">}</span>
231291
</code></pre></div>
232-
</p>
292+
</div></p>
233293
<h2><a href="#relative-page" id="relative-page">関連項目</a></h2>
234294
<ul>
235-
<li><a href="../cpp17/maybe_unused.html">[[maybe_unused]]属性 [P0212R1]</a></li>
295+
<li><a href="../cpp17/maybe_unused.html">C++17 <code>[[maybe_unused]]</code>属性</a></li>
236296
</ul>
237297
<h2>参照</h2>
238298
<ul>

0 commit comments

Comments
 (0)