Gdzie idzie kwalifikator „override” z typami zwrotnymi na końcu?

C ++ 11 ma nowyoverride kwalifikator, który można zastosować do funkcji składowych, aby potwierdzić, że zastępują funkcję wirtualną w klasie bazowej. C ++ 11 pozwala również na końcowe typy powrotu, więc funkcje mogą być zadeklarowane jakoauto f() -> return_type. Kiedy łączę obie te funkcje, nie wiem, czyoverride idzie przed lub po->.

Załóżmy na przykład, że mamy następującą klasę podstawową:

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

Dwie możliwości dla klasy pochodnej to:

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

lub

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

g ++ 4.7.1 kompiluje pierwszą wersję, ale kończy się niepowodzeniem przy drugim

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

podczas gdy clang ++ 4.0 kompiluje drugi, ale kończy się niepowodzeniem przy pierwszym z

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; }

Który z tych kompilatorów rzeczywiście postępuje właściwie zgodnie ze standardem?

Edytować: Jak zauważa Kerrek SB, jest tobłąd w gcc (link Bugzilli).

questionAnswers(2)

yourAnswerToTheQuestion