Куда уходит квалификатор override с конечными типами возврата?
C ++ 11 имеет новыйoverride
квалификатор, который можно применять к функциям-членам, чтобы утверждать, что они переопределяют виртуальную функцию в базовом классе. C ++ 11 также позволяет завершать возвращаемые типы, поэтому функции могут быть объявлены какauto f() -> return_type
, Когда я объединяю обе эти функции, я нене знаю,override
идет до или после.->
Например, предположим, что у нас есть следующий базовый класс:
struct Base {
virtual auto f () const -> int = 0;
};
Две возможности для производного класса:
struct Derived : public Base {
virtual auto f () const override -> int { return 0; } // Compiles on g++ 4.7.1
};
или же
struct Derived : public Base {
virtual auto f () const -> int override { return 0; } // Compiles on clang++ 4.0
};
g ++ 4.7.1 компилирует первую версию, но терпит неудачу на второй с
test.cpp:6:30: error: expected ';' at end of member declaration
test.cpp:6:34: error: 'override' does not name a type
тогда как clang ++ 4.0 компилирует второй, но завершается с первым с
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; }
Какой из этих компиляторов действительно делает правильные вещи в соответствии со стандартом?
Редактировать: Как отмечает Керрек С.Б., этоошибка в gcc (ссылка Bugzilla).