This question is about C++20's [[likely]]
/[[unlikely]]
feature, not compiler-defined macros.
This documents (cppreference) only gave an example on applying them to a switch-case statement. This switch-case example compiles perfectly with my compiler (g++-7.2) so I assume the compiler has implemented this feature, though it's not yet officially introduced in current C++ standards.
But when I use them like this: if (condition) [[likely]] { ... } else { ... }
, I got a warning:
"warning: attributes at the beginning of statement are ignored [-Wattributes]".
So how should I use these attributes in an if-else statement?
Exactly as you are doing, your syntax is correct as per the example given in the draft standard (simplified to show relevant bits only):
But you should understand that this feature is a relatively new one, so may only have placeholders in implementations to allow you to set the attributes. This appears apparent from your warning message.
You should also understand that, unless certain wording changes between the latest draft and the final product, even compliant implementations are able to ignore these attributes. They are very much suggestions to the compiler, like
inline
in C. From that latest draftn4762
(at the time of this answer, and with my emphasis):Note the word "allow" rather than "force", "require" or "mandate".
Based on example from Jacksonville’18 ISO C++ Report the syntax is correct, but it seems that it is not implemented yet:
10.6.6 Likelihood attributes [dcl.attr.likelihood] draft