C++26下划线(_)变量规则及独立名称声明技术咨询
C++26中下划线(_)变量规则及相关问题解答
代码示例说明
你提供的代码在C26之前的标准中会触发重复定义错误,但在C26标准下(开启-std=c++2c或-std=gnu++2c编译选项),这段代码是合法的,编译器仅会给出扩展特性的警告:
void foo() { int _; // warning: name-independent declarations only available with // '-std=c++2c' or '-std=gnu++2c' [-Wc++26-extensions] int _; }
一、C++26中关于下划线(_)变量的规则
在C++26中,下划线(_)被定义为特殊的独立名称,具体规则如下:
- 块作用域(如函数内部)中,可重复声明类型相同的
_变量,这些声明会被视为引用同一个变量,不会触发重复定义错误。 - 若重复声明的
_变量类型不同,会触发编译错误。 - 全局作用域或命名空间作用域中的
_变量规则保持不变,仍遵循原有标准的命名限制(比如全局作用域的_开头名称属于保留名)。
二、什么是独立名称声明(name-independent declaration)
独立名称声明是C++26引入的新特性,核心含义是:使用特殊标识符_进行的变量声明,其绑定关系不依赖于标识符本身的名称,而是依赖于声明的类型和作用域上下文。
简单来说,同一个块作用域内,所有类型一致的_变量声明都会指向同一个变量实体,相当于重复引用而非重复定义。这和普通变量的声明规则完全不同——普通变量的名称是唯一标识,重复声明同名普通变量会触发错误。
三、C++26中下划线(_)变量规则的具体变化
对比C20及更早的标准,C26的变化主要集中在块作用域内:
- 旧规则:任何作用域中,普通变量的重复声明(除非是外部链接声明)都会触发编译错误,
_作为普通标识符也遵循此规则,块作用域内重复声明int _;会报错。 - 新规则:块作用域内,类型相同的
_变量重复声明被允许,视为对同一变量的多次声明;只有当类型不一致时(比如先声明int _;再声明double _;),才会触发错误。 - 全局/命名空间作用域的
_命名规则未变,仍然不能直接使用单个_作为变量名(属于标准保留的命名空间)。
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

