Inhaltsverzeichnis

Attributspezifizierer

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.

C++11

[[noreturn]] void f() { throw ""; }

Die Funktion wird nicht auf normalem Wege beendet.

C++14

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.

C++17

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
}