JVA*_*pen 10 c++ attributes language-lawyer c++17
看一下规范[[maybe_unused]],它说:
出现在类,typedef,变量,非静态数据成员,函数,枚举或枚举器的声明中.如果编译器对未使用的实体发出警告,则对于声明为maybe_unused的任何实体,将禁止该警告.
由于这提到了调查员,我有点期望它有一个用例.我唯一想到的就是-Wswitch警告,我和Clang,GCC和MSVC一起尝试过.
enum A
{
B,
C [[maybe_unused]]
};
void f(A a)
{
switch (a)
{
case B: break;
}
}
Run Code Online (Sandbox Code Playgroud)
所有3个编译器都给出了以下警告的变体:
<source>:9:13: warning: enumeration value 'C' not handled in switch [-Wswitch]
switch (a)
^
Run Code Online (Sandbox Code Playgroud)
这是使用此属性的有效用例吗?是否有其他用例在此位置添加属性或者这只是一个无用的添加?
此属性的意图是声明可能永远不会使用实体,如果是这种情况,则实现不应该在某处警告您,例如,您可能正在使用错误的实体.
switch语句是完全不同的事情:即使从未在该TU中使用枚举器,处理枚举器也是有问题的; 它表示程序中存在逻辑差距.如果该函数具有外部链接,并且其他人使用该枚举器调用它,该怎么办?
简而言之,即使在我们将枚举器标记为可能未使用的TU中(这感觉毫无意义,因为它们通常在命名空间范围内),在程序逻辑中覆盖它仍然是非常好的建议(并且Clang非常适合给你那个建议).
已记录 Clang 的错误并标记为已解决:https://bugs.llvm.org/show_bug.cgi ?id=36231
这似乎证实了如果枚举值被标记为 [[maybe_unused]],则允许在没有警告的情况下在开关中丢失枚举值。
| 归档时间: |
|
| 查看次数: |
272 次 |
| 最近记录: |