Wohin geht das Qualifikationsmerkmal 'override' mit nachfolgenden Rückgabetypen?

C ++ 11 hat das Neueoverride Qualifizierer, der auf Mitgliedsfunktionen angewendet werden kann, um zu bestätigen, dass sie eine virtuelle Funktion in der Basisklasse überschreiben. In C ++ 11 sind auch nachfolgende Rückgabetypen zulässig, sodass Funktionen als deklariert werden könnenauto f() -> return_type. Wenn ich diese beiden Funktionen kombiniere, weiß ich nicht, oboverride geht vor oder nach dem->.

Angenommen, wir haben die folgende Basisklasse:

struct Base {
    virtual auto f () const -> int = 0;
};

Die zwei Möglichkeiten für eine abgeleitete Klasse sind:

struct Derived : public Base {
    virtual auto f () const override -> int { return 0; } // Compiles on g++ 4.7.1
};

oder

struct Derived : public Base {
    virtual auto f () const -> int override { return 0; } // Compiles on clang++ 4.0
};

g ++ 4.7.1 kompiliert die erste Version, schlägt aber auf der zweiten mit fehl

test.cpp:6:30: error: expected ';' at end of member declaration
test.cpp:6:34: error: 'override' does not name a type

während clang ++ 4.0 das zweite kompiliert, aber beim ersten mit versagt

test.cpp:6:11: error: 'auto' return without trailing return type
  virtual auto f () const override -> int { return 0; }
          ^
test.cpp:6:3: error: only virtual member functions can be marked 'override'
  virtual auto f () const override -> int { return 0; }
  ^                       ~~~~~~~~
test.cpp:6:35: error: expected ';' at end of declaration list
  virtual auto f () const override -> int { return 0; }

Welcher dieser Compiler macht eigentlich das Richtige nach dem Standard?

Bearbeiten: Wie Kerrek SB feststellt, ist diesein Bug in gcc (Bugzilla Link).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage