[[maybe_unused]]在枚举器上

时间:2018-01-28 16:35:19

标签: 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;
    }
}

所有3个编译器都给出了以下警告的变体:

<source>:9:13: warning: enumeration value 'C' not handled in switch [-Wswitch]
    switch (a)
            ^

Live code

这是否是使用此属性的有效用例,是否有其他用例在此位置添加属性或者这只是一个无用的添加?

2 个答案:

答案 0 :(得分:5)

此属性的目的是声明实体可能永远不会被使用,如果是这样的话,实现不应该在某处警告你例如,您可能使用错误的实体。

switch语句是一个完全不同的问题:即使枚举器从未在该TU中使用处理枚举器也是有问题的;它表示程序中存在逻辑差距。如果该函数具有外部链接,并且其他人使用该枚举器调用它,该怎么办?

简而言之,即使在我们将枚举器标记为可能未使用的TU中(感觉毫无意义,因为它们通常在命名空间范围内),在程序逻辑中覆盖它仍然是非常明智的(并且Clang非常正确)在给你这个建议。)

答案 1 :(得分:0)

记录了Clang的一个错误并将其标记为已解决:https://bugs.llvm.org/show_bug.cgi?id=36231

这似乎可以确认枚举值允许在没有警告的情况下在开关中丢失,以防被标记为[[maybe_unused]]