属性可以应用于构造函数参数吗?

Can attributes be applied to constructor parameters?

Clang 8.0.0 和 GCC 9.1.0 似乎不同意这是否是有效代码。

struct Foo {
  Foo([[maybe_unused]] int x) {}
};
int main() {}

Clang 不产生警告(即使使用 -Wall -Wextra -Wpedantic)但 GCC 产生此错误:

test.cpp:2:7: error: expected unqualified-id before '[' token
    2 |   Foo([[maybe_unused]] int x) {}
      |       ^
test.cpp:2:7: error: expected ')' before '[' token
    2 |   Foo([[maybe_unused]] int x) {}
      |      ~^
      |       )

那么哪个编译器有错误?

您的代码有效

The [[maybe_unused]] attribute can be applied to the declaration of a struct, enum, union, typedef, variable (including member variables), function, or enumerator. Implementations are encouraged to not emit a diagnostic when such an entity is unused or when the entity is used despite being marked as [[maybe_unused]].

但是 gcc maybe_unused attribute triggers syntax error when used on first argument to a constructor 中已经有关于此的错误报告。 gcc 可能无法正确解析它。

是的,可以申请。标准允许这样做。

10.6.6 Maybe unused attribute [dcl.attr.unused]
...
2 The attribute may be applied to the declaration of a class, a typedef-name, a variable, a non-static data member, a function, an enumeration, or an enumerator.

所以这里的 Clang 是正确的,这是一个 GCC 错误。 已为此标题提交错误报告:maybe_unused attribute triggers syntax error when used on first argument to a constructor

这可能是您的 GCC 编译行中的问题。 当 运行 以下行时,我收到类似的错误:

gcc *.cpp -o run_me

但是,使用以下行时没有问题:

gcc -std=c++17 *.cpp -o run_me -Wall -Wextra -Wpedantic

运行 标准 c++11 会给出警告 "use of the 'maybe_unused' attribute is a C++17 extension"。编译这段代码时一定要使用c++17。