C++ 属性: indeterminate (C++26 起)

来自cppreference.com
< cpp‎ | language‎ | attributes


 
 
C++ 语言
 
 
属性
(C++23)
(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]]; // 不确定值
    int y;                   // 错误值
 
    f(x); // 未定义行为
    f(y); // 错误行为
}
 
struct T
{
    T() {}
    int x;
};
 
void h(T a [[indeterminate]], T b)
{
    f(a.x); // 在以下调用时有未定义行为
    f(b.x); // 在以下调用时有错误行为
}
 
h(T(), T());

引用

  • C++26 标准(ISO/IEC 14882:2026):
  • 9.12.7 Indeterminate storage [dcl.attr.indet]