Onde o qualificador 'override' combina com os tipos de retorno à direita?
C ++ 11 tem o novooverride
qualificador que pode ser aplicado a funções-membro para afirmar que elas substituem uma função virtual na classe base. O C ++ 11 também permite tipos de retorno à direita para que as funções possam ser declaradas comoauto f() -> return_type
. Quando eu combino esses dois recursos, não sei seoverride
vai antes ou depois do->
.
Por exemplo, suponha que tenhamos a seguinte classe base:
struct Base {
virtual auto f () const -> int = 0;
};
As duas possibilidades para uma classe derivada são:
struct Derived : public Base {
virtual auto f () const override -> int { return 0; } // Compiles on g++ 4.7.1
};
ou
struct Derived : public Base {
virtual auto f () const -> int override { return 0; } // Compiles on clang++ 4.0
};
g ++ 4.7.1 compila a primeira versão, mas falha no segundo com
test.cpp:6:30: error: expected ';' at end of member declaration
test.cpp:6:34: error: 'override' does not name a type
Considerando clang ++ 4.0 compila o segundo, mas falha no primeiro com
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; }
Qual desses compiladores está realmente fazendo a coisa certa de acordo com o padrão?
Editar: Como Kerrek SB observa, isso éum bug no gcc (link do Bugzilla).