属性可以应用于构造函数参数吗?
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。
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。