attribute specifier sequence(since C++11)
Introduces implementation-defined attributes for types, objects, code, etc.
[[attr]][[attr1, attr2, attr3(args)]][[namespace::attr(args)]]alignas_specifier
Formally, the syntax is
[[ attribute-list ]]
|
(since C++11) | ||||||||
[[ using attribute-namespace : attribute-list ]]
|
(since C++17) | ||||||||
where attribute-list is a comma-separated sequence of zero or more attributes (possibly ending with an ellipsis ... indicating a pack expansion)
| identifier | (1) | ||||||||
attribute-namespace :: identifier
|
(2) | ||||||||
identifier ( argument-list )
|
(3) | ||||||||
attribute-namespace :: identifier ( argument-list )
|
(4) | ||||||||
|
If [[using CC: opt(1), debug]] // same as [[CC::opt(1), CC::debug]] [[using CC: CC::opt(1)]] // error: cannot combine using and scoped attribute |
(since C++17) |
[[noreturn]]
|
indicates that the function does not return |
[[carries_dependency]]
|
indicates that dependency chain in release-consume std::memory_order propagates in and out of the function |
[[deprecated]](C++14)[[deprecated("reason")]](C++14)
|
indicates that the use of the name or entity declared with this attribute is allowed, but discouraged for some reason |
[[fallthrough]](C++17)
|
indicates that the fall through from the previous case label is intentional and should not be diagnosed by a compiler that warns on fall-through |
[[nodiscard]](C++17)[[nodiscard("reason")]](C++20)
|
encourages the compiler to issue a warning if the return value is discarded |
[[maybe_unused]](C++17)
|
suppresses compiler warnings on unused entities, if any |
[[likely]](C++20)[[unlikely]](C++20)
|
indicates that the compiler should optimize for the case where a path of execution through a statement is more or less likely than any other path of execution |
[[no_unique_address]](C++20)
|
indicates that a non-static data member need not have an address distinct from all other non-static data members of its class |
[[optimize_for_synchronized]](TM TS)
|
indicates that the function definition should be optimized for invocation from a synchronized statement |
Example
[[gnu::always_inline]] [[gnu::hot]] [[gnu::const]] [[nodiscard]] inline int f(); // declare f with four attributes [[gnu::always_inline, gnu::const, gnu::hot, nodiscard]] int f(); // same as above, but uses a single attr specifier that contains four attributes // C++17: [[using gnu : const, always_inline, hot]] [[nodiscard]] int f[[gnu::always_inline]](); // an attribute may appear in multiple specifiers int f() { return 0; } int main() { }