C++ 属性: indeterminate (C++26 以降)
From cppreference.com
< cpp | language | attributes
変数または関数パラメータが初期化されていない場合に不定な値を持つことを示します。
目次 |
[編集] 構文
[[indeterminate]]
|
|||||||||
[編集] 解説
[[indeterminate]] は、自動記憶域期間を持つブロック変数の定義、または関数宣言のパラメータの宣言に適用できます。この属性は、自動記憶域期間を持つオブジェクトの記憶域を構成するバイトが、初期値としてエラー値ではなく不定であることを指定します。
関数パラメータが [[indeterminate]] で宣言されている場合、その関数の最初の宣言で宣言されなければなりません。ある翻訳単位の関数の最初の宣言で、ある関数パラメータが [[indeterminate]] で宣言され、別の翻訳単位の同じ関数の最初の宣言で、同じパラメータが [[indeterminate]] なしで宣言されている場合、プログラムは不正形式であり、診断は不要です。
[編集] 備考
[[indeterminate]] 属性は、C++26 まで暗黙的に導入されていた未定義動作を復元します。これにより、コンパイラは不定な値を読み取るコードパスに到達不能であると見なす可能性があります。
[編集] 例
このコードを実行
void f(int); void g() { int x [[indeterminate]]; // indeterminate value int y; // erroneous value f(x); // undefined behavior f(y); // erroneous behavior } struct T { T() {} int x; }; void h(T a [[indeterminate]], T b) { f(a.x); // undefined behavior when called below f(b.x); // erroneous behavior when called below } h(T(), T());
[編集] 参照
- C++26 標準 (ISO/IEC 14882:2026)
- 9.12.7 不定な記憶域 [dcl.attr.indet]