|
68 | 68 |
|
69 | 69 | </head> |
70 | 70 | <body> |
71 | | -<header data-kunai-mdinfo="{"meta": {"header": ["cassert"], "id-type": ["macro"]}, "sources": [{"id": "816ab7966a1b1daae5533f5845cfc5783121b965", "source": "#include <cassert>\n\nvoid f(int x)\n{\n // \u30d1\u30e9\u30e1\u30fc\u30bfx\u306f\u3001\u6b63\u6570\u3067\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044\n assert(x >= 0);\n\n // \u2026x\u3092\u4f7f\u3063\u305f\u51e6\u7406\u2026\n}\n\nint main()\n{\n f(3); // OK\n f(-1); // \u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u7570\u5e38\u7d42\u4e86\u3059\u308b\n}\n"}, {"id": "4f6e4f99529f30bffa6fc2d2f92b1985d40c0297", "source": "#include <cassert>\n\nconstexpr int f(int x)\n{\n assert(x >= 0); // constexpr\u95a2\u6570\u5185\u306b\u5f0f\u3068\u3057\u3066assert\u30de\u30af\u30ed\u3092\u4f7f\u7528\u3059\u308b\n return x + 1;\n}\n\nint main()\n{\n constexpr int a = f(1);\n//constexpr int b = f(-1); // \u30b3\u30f3\u30d1\u30a4\u30eb\u30a8\u30e9\u30fc\uff01\n}\n"}, {"id": "3b31955d436017ab3ce52a549edee9f90a4a27f2", "source": "#include <cassert>\n#include <type_traits>\n\ntemplate <class T>\nvoid f()\n{\n assert(std::is_same_v<int, T>); // C++26 : OK\n assert((std::is_same_v<int, T>)); // C++23\u307e\u3067\u306f\u3001\u30ab\u30f3\u30de\u3092\u542b\u3080\u5f0f\u306f\u5168\u4f53\u3092\u4e38\u30ab\u30c3\u30b3\u3067\u56f2\u3080\u5fc5\u8981\u304c\u3042\u308b\n}\n\nint main()\n{\n f<int>();\n f<double>();\n}\n"}], "page_id": ["reference", "cassert", "assert"]}"> |
| 71 | +<header data-kunai-mdinfo="{"meta": {"header": ["cassert"], "id-type": ["macro"]}, "sources": [{"id": "816ab7966a1b1daae5533f5845cfc5783121b965", "source": "#include <cassert>\n\nvoid f(int x)\n{\n // \u30d1\u30e9\u30e1\u30fc\u30bfx\u306f\u3001\u6b63\u6570\u3067\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044\n assert(x >= 0);\n\n // \u2026x\u3092\u4f7f\u3063\u305f\u51e6\u7406\u2026\n}\n\nint main()\n{\n f(3); // OK\n f(-1); // \u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u7570\u5e38\u7d42\u4e86\u3059\u308b\n}\n"}, {"id": "4f6e4f99529f30bffa6fc2d2f92b1985d40c0297", "source": "#include <cassert>\n\nconstexpr int f(int x)\n{\n assert(x >= 0); // constexpr\u95a2\u6570\u5185\u306b\u5f0f\u3068\u3057\u3066assert\u30de\u30af\u30ed\u3092\u4f7f\u7528\u3059\u308b\n return x + 1;\n}\n\nint main()\n{\n constexpr int a = f(1);\n//constexpr int b = f(-1); // \u30b3\u30f3\u30d1\u30a4\u30eb\u30a8\u30e9\u30fc\uff01\n}\n"}, {"id": "fa7d266f311e5c55866234f8e71e30fa624631ab", "source": "#include <cassert>\n#include <vector>\n#include <type_traits>\n\ntemplate <class T>\nvoid f(const std::vector<T>& v)\n{\n // C++26 : \u30ab\u30f3\u30de\u3092\u542b\u3080\u5f0f\u3092\u305d\u306e\u307e\u307e\u66f8\u3051\u308b\n assert(v == std::vector<T>{1, 2, 3});\n assert(std::is_same_v<int, T>);\n\n // C++23\u307e\u3067 : \u5f0f\u5168\u4f53\u3092\u4e38\u30ab\u30c3\u30b3\u3067\u56f2\u3080\u5fc5\u8981\u304c\u3042\u308b\n assert((v == std::vector<T>{1, 2, 3}));\n assert((std::is_same_v<int, T>));\n}\n\nint main()\n{\n f(std::vector<int>{1, 2, 3});\n}\n"}], "page_id": ["reference", "cassert", "assert"]}"> |
72 | 72 | <nav class="navbar navbar-default" role="navigation"> |
73 | 73 | <div class="container-fluid"> |
74 | 74 | <div class="navbar-header"> |
|
189 | 189 | <p class="text-right"><small> |
190 | 190 | 最終更新日時: |
191 | 191 | <time itemprop="datePublished" class="js-local-time" |
192 | | - datetime="2026-08-25T12:11:17+09:00"> |
193 | | - 2026年08月25日 12時11分17秒 (JST) |
| 192 | + datetime="2026-09-11T11:43:54+09:00"> |
| 193 | + 2026年09月11日 11時43分54秒 (JST) |
194 | 194 | </time> |
195 | 195 | <br/> |
196 | 196 | <span itemprop="author" itemscope itemtype="http://schema.org/Person"> |
@@ -278,6 +278,12 @@ <h2>備考</h2> |
278 | 278 | <li>マクロ<code>NDEBUG</code>は、標準C++の言語およびライブラリでは定義しない。開発環境やユーザーが定義することとなる。<code>NDEBUG</code>を定義せず<code>assert</code>を有効にした設定を「デバッグビルド」、<code>NDEBUG</code>を定義して<code>assert</code>を無効にした設定を「リリースビルド」などとして複数のビルド設定を持つ開発環境がある。</li> |
279 | 279 | <li>マクロ<code>NDEBUG</code>の定義の状態を変えて<code><cassert></code>をインクルードしなおすことで翻訳単位中で有効・無効を切り替えることも可能である。</li> |
280 | 280 | <li>実行環境や入力によって起こりえるエラーに対するエラー処理としてこのマクロを使用すると無効化された場合に意図しない動作となることがあるので、別な手段として、<a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a>、<code>bool</code>型の返却値などを検討すること。</li> |
| 281 | +<li>C++26 : <code>__VA_ARGS__</code>が<a class="cpprefjp-defined-word" data-desc="プログラムが文法規則・診断対象の意味規則・単一定義規則を満たすこと" href="../../implementation-compliance.html#dfn-well-formed">適格</a>な代入式に展開されない場合、プログラムは<a class="cpprefjp-defined-word" data-desc="プログラムが適格でないこと。コンパイルエラーなどになる" href="../../implementation-compliance.html#dfn-ill-formed">不適格</a>となる。カンマ演算子を使った式は代入式ではないため、<code>static_assert</code>のように条件とメッセージをカンマで並べて書くことはできない。メッセージを併記したい場合は、<code>&&</code>で連結する。 |
| 282 | + <br /> |
| 283 | +<div class="codehilite"><pre><span></span><code><span class="n"><a href="">assert</a></span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n"><a href="../vector/vector/size.html">v.size()</a></span><span class="p">,</span><span class="w"> </span><span class="s">"index is out of <a href="../ranges/range.html">range</a>"</span><span class="p">);</span><span class="w"> </span><span class="c1">// コンパイルエラー</span> |
| 284 | +<span class="n"><a href="">assert</a></span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n"><a href="../vector/vector/size.html">v.size()</a></span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="s">"index is out of <a href="../ranges/range.html">range</a>"</span><span class="p">);</span><span class="w"> </span><span class="c1">// OK</span> |
| 285 | +</code></pre></div> |
| 286 | +</li> |
281 | 287 | <li>C++26 : 引数の式を未評価オペランドとして扱ったときに<a class="cpprefjp-defined-word" data-desc="プログラムが適格でないこと。コンパイルエラーなどになる" href="../../implementation-compliance.html#dfn-ill-formed">不適格</a>となる場合、プログラムは<a class="cpprefjp-defined-word" data-desc="プログラムが適格でないこと。コンパイルエラーなどになる" href="../../implementation-compliance.html#dfn-ill-formed">不適格</a>となる(<a class="cpprefjp-defined-word" data-desc="処理系は規則違反に対してエラーメッセージや警告を出さないかもしれない" href="../../implementation-compliance.html#dfn-no-diagnostic-required">診断不要</a>)。たとえば<code>co_await</code>や<code>co_yield</code>は未評価オペランド内で使用できないため、<code>assert</code>の引数に書くことはできない。</li> |
282 | 288 | </ul> |
283 | 289 | <h2>例</h2> |
@@ -321,20 +327,26 @@ <h3>定数式としてassertマクロを使用する (C++17)</h3> |
321 | 327 | <h3>出力</h3> |
322 | 328 | <p><pre><code></code></pre></p> |
323 | 329 | <h3>カンマを含む条件式をassertマクロで使用する (C++26)</h3> |
324 | | -<p><div class="yata" id="3b31955d436017ab3ce52a549edee9f90a4a27f2"><div class="codehilite"><pre><span></span><code><span class="cp">#include <a href="../cassert.html"><cassert></a></span> |
| 330 | +<p>C++26では<code>assert</code>が可変引数マクロとなったため、テンプレート実引数の区切りや波カッコ初期化に含まれるカンマを、そのまま条件式に書ける。</p> |
| 331 | +<p><div class="yata" id="fa7d266f311e5c55866234f8e71e30fa624631ab"><div class="codehilite"><pre><span></span><code><span class="cp">#include <a href="../cassert.html"><cassert></a></span> |
| 332 | +<span class="cp">#include <a href="../vector.html"><vector></a></span> |
325 | 333 | <span class="cp">#include <a href="../type_traits.html"><type_traits></a></span> |
326 | 334 |
|
327 | 335 | <span class="k">template</span><span class="w"> </span><span class="o"><</span><span class="k">class</span><span class="w"> </span><span class="nc">T</span><span class="o">></span> |
328 | | -<span class="kt">void</span><span class="w"> </span><span class="n">f</span><span class="p">()</span> |
| 336 | +<span class="kt">void</span><span class="w"> </span><span class="n">f</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n"><a href="../vector/vector.html">std::vector</a></span><span class="o"><</span><span class="n">T</span><span class="o">>&</span><span class="w"> </span><span class="n">v</span><span class="p">)</span> |
329 | 337 | <span class="p">{</span> |
330 | | -<span class="w"> </span><span class="n"><a href="">assert</a></span><span class="p">(</span><span class="n"><a href="../type_traits/is_same.html">std::is_same_v</a></span><span class="o"><</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="n">T</span><span class="o">></span><span class="p">);</span><span class="w"> </span><span class="c1">// C++26 : OK</span> |
331 | | -<span class="w"> </span><span class="n"><a href="">assert</a></span><span class="p">((</span><span class="n"><a href="../type_traits/is_same.html">std::is_same_v</a></span><span class="o"><</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="n">T</span><span class="o">></span><span class="p">));</span><span class="w"> </span><span class="c1">// C++23までは、カンマを含む式は全体を丸カッコで囲む必要がある</span> |
| 338 | +<span class="w"> </span><span class="c1">// C++26 : カンマを含む式をそのまま書ける</span> |
| 339 | +<span class="w"> </span><span class="n"><a href="">assert</a></span><span class="p">(</span><span class="n">v</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n"><a href="../vector/vector.html">std::vector</a></span><span class="o"><</span><span class="n">T</span><span class="o">></span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">});</span> |
| 340 | +<span class="w"> </span><span class="n"><a href="">assert</a></span><span class="p">(</span><span class="n"><a href="../type_traits/is_same.html">std::is_same_v</a></span><span class="o"><</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="n">T</span><span class="o">></span><span class="p">);</span> |
| 341 | + |
| 342 | +<span class="w"> </span><span class="c1">// C++23まで : 式全体を丸カッコで囲む必要がある</span> |
| 343 | +<span class="w"> </span><span class="n"><a href="">assert</a></span><span class="p">((</span><span class="n">v</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n"><a href="../vector/vector.html">std::vector</a></span><span class="o"><</span><span class="n">T</span><span class="o">></span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">}));</span> |
| 344 | +<span class="w"> </span><span class="n"><a href="">assert</a></span><span class="p">((</span><span class="n"><a href="../type_traits/is_same.html">std::is_same_v</a></span><span class="o"><</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="n">T</span><span class="o">></span><span class="p">));</span> |
332 | 345 | <span class="p">}</span> |
333 | 346 |
|
334 | 347 | <span class="kt">int</span><span class="w"> </span><span class="n">main</span><span class="p">()</span> |
335 | 348 | <span class="p">{</span> |
336 | | -<span class="w"> </span><span class="n">f</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">();</span> |
337 | | -<span class="w"> </span><span class="n">f</span><span class="o"><</span><span class="kt">double</span><span class="o">></span><span class="p">();</span> |
| 349 | +<span class="w"> </span><span class="n">f</span><span class="p">(</span><span class="n"><a href="../vector/vector.html">std::vector</a></span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">});</span> |
338 | 350 | <span class="p">}</span> |
339 | 351 | </code></pre></div> |
340 | 352 | </div></p> |
|
0 commit comments