Providing metadata to the compiler with attributes
C++ has been very deficient when it comes to features that enable reflection or introspection on types or data or standard mechanisms to define language extensions. Because of that, compilers have defined their own specific extensions for this purpose. Examples include the VC++ __declspec()
specifier or the GCC __attribute__((...))
. C++11, however, introduces the concept of attributes that enable compilers to implement extensions in a standard way or even embedded domain-specific languages. The new C++ standards define several attributes all compilers should implement, and that will be the topic of this recipe.
How to do it...
Use standard attributes to provide hints for the compiler about various design goals:
- To ensure that the return value from a function cannot be ignored, declare the function with the
[[nodiscard]]
attribute:
[[nodiscard]] int get_value1() { return 42; } get_value1(); ...