28
28
< meta property ="og:url " content ="https://cpprefjp.github.io/lang/cpp26/nice_placeholder_with_no_name.html " />
29
29
< meta property ="og:site_name " content ="cpprefjp - C++日本語リファレンス " />
30
30
< meta property ="og:type " content ="article " />
31
- < meta property ="og:description " content ="C++17で採用された、`[[maybe_unused]]`属性を変数名`_`の場合、自動的につける 。 " />
31
+ < meta property ="og:description " content ="C++26では、宣言だけして使用しない変数として、変数名`_`を特別扱いする 。 " />
32
32
< meta name ="twitter:card " content ="summary " />
33
33
< meta name ="twitter:title " content ="宣言のみで使用しない変数の名前として_をサポート [P2169R4] - cpprefjp C++日本語リファレンス " />
34
34
< 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では、宣言だけして使用しない変数として、変数名`_`を特別扱いする 。 " />
36
36
37
37
38
38
< link rel ="alternate " type ="application/atom+xml " title ="Atom " href ="https://cpprefjp.github.io/rss.xml " />
68
68
69
69
</ head >
70
70
< body >
71
- < header data-kunai-mdinfo ="{"meta": {"cpp": ["cpp26"]}, "sources": [], "page_id": ["lang", "cpp26", "nice_placeholder_with_no_name"]} ">
71
+ < header data-kunai-mdinfo ="{"meta": {"cpp": ["cpp26"]}, "sources": [{"id": "1bdad0861a25f90015e99357980a767a94a69b53", "source": "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"}], "page_id": ["lang", "cpp26", "nice_placeholder_with_no_name"]} ">
72
72
< nav class ="navbar navbar-default " role ="navigation ">
73
73
< div class ="container-fluid ">
74
74
< div class ="navbar-header ">
188
188
189
189
< p class ="text-right "> < small >
190
190
最終更新日時(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秒
193
193
</ span >
194
194
< br />
195
195
< span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
196
- < span itemprop ="name "> rotarymars </ span >
196
+ < span itemprop ="name "> Akira Takahashi </ span >
197
197
</ span >
198
198
が更新
199
199
</ small > </ p >
@@ -218,21 +218,81 @@ <h1 itemprop="name"><span class="token">宣言のみで使用しない変数の
218
218
< p > のちのC++規格でさらに変更される場合があるため< a href ="#relative-page "> 関連項目</ a > を参照してください。</ p >
219
219
< p > </ p >
220
220
< 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 "> <</ 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 "> ></ 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 "> <</ 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 "> ></ 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 >
224
282
< span class ="c1 "> // gccやclangの場合、-Wallオプションをつけると、</ span >
225
283
< span class ="c1 "> // 変数が未使用だった場合、警告が出力される。</ span >
226
284
< 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
+
227
287
< span class ="c1 "> // しかし、今後は、変数名が_であれば、自動的にその属性が適用されるようになる。</ span >
288
+ < span class ="c1 "> // 以下のコードを-Wallでコンパイルしても、警告は表示されない。</ span >
228
289
< span class ="kt "> int</ span > < span class ="n "> _</ span > < span class ="p "> ;</ span >
229
- < span class ="c1 "> // このコードを-Wallでコンパイルしても、警告は表示されない。</ span >
230
290
< span class ="p "> }</ span >
231
291
</ code > </ pre > </ div >
232
- </ p >
292
+ </ div > </ p >
233
293
< h2 > < a href ="#relative-page " id ="relative-page "> 関連項目</ a > </ h2 >
234
294
< 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 >
236
296
</ ul >
237
297
< h2 > 参照</ h2 >
238
298
< ul >
0 commit comments