C++26中_ underscore变量的规则是什么?什么是独立于名称的声明?

dw1jzc5e  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(65)

当我编译下面的代码时,我得到一个警告(https://godbolt.org/z/Tx7v6jWf1):

void foo() {
    int _;
    // warning: name-independent declarations only available with
    //           '-std=c++2c' or '-std=gnu++2c' [-Wc++26-extensions]
    int _;
}

字符串
C++26中的_变量到底发生了什么变化,什么是 * name-independent声明 *?

bz4sfanl

bz4sfanl1#

P2169: A nice placeholder with no name已被C++26接受,这使得_在以下上下文中变得特殊:

  • 局部变量(例如int _
  • 本地结构化绑定(例如auto [x, _]
  • init-captures(例如[_ = 0] {}
  • 匿名联合体以外的非静态数据成员(例如struct S { int _; }

在这样的上下文中,_使声明与名称无关。

_抑制警告

该标准说:

  • 推荐做法 *:实现不应发出使用或未使用名称无关声明的警告。

这与[dcl.attr.unused] p4中对[[maybe_unused]]的建议非常相似。通常,您会收到未使用变量的警告(GCC中的-Wunused),但_[[maybe_unused]]会抑制此警告。
历史上,开发人员使用_作为未使用的东西的“占位符”,所以这只是标准化现有的实践。

_可以多次声明

此外,与名称无关的声明不会发生冲突。简而言之,您可以多次声明_。但是,名称查找不能有二义性。

void g() {
  int _;
  _ = 0;   // OK, and warning is not recommended
  int _;   // OK, name-independent declaration does not potentially conflict with the first _
  _ = 0;   // error: two non-function declarations in the lookup set
}

字符串
此代码摘自[basic.scope.scope]示例3。
请注意,_还与using声明有一些特殊的交互。有关更多详细信息,请参见[namespace.udecl] p10。

两个_从链接器的Angular 来看不是同一个实体

即使有外部链接,两个_也不被认为是同一个实体:

// a.cpp
int _ = 0;
// b.cpp
int _ = 0;

的数据
当链接时,这个程序是可以的。对于_以外的任何名称,这将给予你一个“多定义”链接器错误。另见[basic.link]第8页。

主机支持

在撰写本文时,只有GCC 14和Clang 18支持此功能。有关更多信息,请参阅C++26 compiler support
如果您需要测试支持,请测试__cpp_placeholder_variables

#if __cpp_placeholder_variables >= 202306L

相关问题