¿A dónde va el calificador de "anulación" con los tipos de retorno finales?
C ++ 11 tiene el nuevooverride
calificador que se puede aplicar a las funciones miembro para afirmar que anulan una función virtual en la clase base. C ++ 11 también permite tipos de retorno finales para que las funciones se puedan declarar comoauto f() -> return_type
. Cuando combino ambas características, no sé sioverride
va antes o después de la->
.
Por ejemplo, supongamos que tenemos la siguiente clase base:
struct Base {
virtual auto f () const -> int = 0;
};
Las dos posibilidades para una clase derivada son:
struct Derived : public Base {
virtual auto f () const override -> int { return 0; } // Compiles on g++ 4.7.1
};
o
struct Derived : public Base {
virtual auto f () const -> int override { return 0; } // Compiles on clang++ 4.0
};
g ++ 4.7.1 compila la primera versión pero falla en la segunda con
test.cpp:6:30: error: expected ';' at end of member declaration
test.cpp:6:34: error: 'override' does not name a type
mientras que clang ++ 4.0 compila el segundo pero falla en el primero con
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; }
¿Cuál de estos compiladores está haciendo lo correcto de acuerdo con el estándar?
Editar: Como señala Kerrek SB, esto esun error en gcc (enlace Bugzilla).