名前空間
変種
操作

C++ 属性: indeterminate (C++26 以降)

From cppreference.com
< cpp‎ | language‎ | attributes
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 
属性
(C++23)
(C++11)(C++26 まで)
(C++14)
indeterminate
(C++26)
(C++20)
(C++17)
(C++11)
(C++20)
 

変数または関数パラメータが初期化されていない場合に不定な値を持つことを示します。

目次

[編集] 構文

[[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]
English 日本語 中文(简体) 中文(繁體)