Seit C++11 können Hinweise für Compiler in doppelten eckigen Klammern [[…]]
hinterlegt werden.
Unbekannte Attribute werden vom Compiler ignoriert.
Die Sprachstandards definieren einige Attribute.
[[noreturn]] void f() { throw ""; }
Die Funktion wird nicht auf normalem Wege beendet.
struct [[deprecated]] X {}; [[deprecated("Nutze g()")]] void f(); void g(int [[deprecated]] x = 10);
markiert geächtete Namen. Der Compiler kann bei deren Nutzung eine Warnung ausgeben.
In manchen Mehrfachverzweigungen fehlt die break
-Anweisung absichtlich.
Vor den Sprungmarken kann darauf hingeweisen werden,
so dass der Compiler nicht davor warnen muss:
switch (x) { case 0: case 1: // ... [[fallthrough]] case 2: // ... break; default: // ... }
Das Attribut [[nodiscard]]
weist darauf hin, dass der Typ als Ergebnis eines Ausdrucks oder Funktionsaufrufs nicht ignoriert werden darf.
[[maybe_unused]]
unterdrückt Compilerwarnungen zu unbenutzten Variablen oder Funktionen.
struct [[nodiscard]] X {}; X f(){ return {}; } int main() { f(); // Warnung: Rückgabewert ignoriert (void)f(); // ok [[maybe_unused]] auto result = f(); // ok }