当我编译下面的代码时,我得到一个警告(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声明 *?
1条答案
按热度按时间bz4sfanl1#
P2169: A nice placeholder with no name已被C++26接受,这使得
_
在以下上下文中变得特殊:int _
)auto [x, _]
)[_ = 0] {}
)struct S { int _; }
)在这样的上下文中,
_
使声明与名称无关。_
抑制警告该标准说:
这与[dcl.attr.unused] p4中对
[[maybe_unused]]
的建议非常相似。通常,您会收到未使用变量的警告(GCC中的-Wunused
),但_
和[[maybe_unused]]
会抑制此警告。历史上,开发人员使用
_
作为未使用的东西的“占位符”,所以这只是标准化现有的实践。_
可以多次声明此外,与名称无关的声明不会发生冲突。简而言之,您可以多次声明
_
。但是,名称查找不能有二义性。字符串
此代码摘自[basic.scope.scope]示例3。
请注意,
_
还与using
声明有一些特殊的交互。有关更多详细信息,请参见[namespace.udecl] p10。两个
_
从链接器的Angular 来看不是同一个实体即使有外部链接,两个
_
也不被认为是同一个实体:的数据
当链接时,这个程序是可以的。对于
_
以外的任何名称,这将给予你一个“多定义”链接器错误。另见[basic.link]第8页。主机支持
在撰写本文时,只有GCC 14和Clang 18支持此功能。有关更多信息,请参阅C++26 compiler support。
如果您需要测试支持,请测试
__cpp_placeholder_variables
:型