'override'限定符在哪里与尾随返回类型一起使用?

Ros*_*iff 33 c++ c++11

C++ 11具有新的override限定符,可以应用于成员函数以声明它们覆盖基类中的虚函数.C++ 11还允许尾随返回类型,因此可以将函数声明为auto f() -> return_type.当我结合这两个功能时,我不知道是override在之前还是之后->.

例如,假设我们有以下基类:

struct Base {
    virtual auto f () const -> int = 0;
};
Run Code Online (Sandbox Code Playgroud)

派生类的两种可能性是:

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

要么

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

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
Run Code Online (Sandbox Code Playgroud)

而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; }
Run Code Online (Sandbox Code Playgroud)

根据标准,哪些编译器实际上正在做正确的事情?

编辑:正如Kerrek SB所说,这是gcc中的一个错误(Bugzilla链接).

Ker*_* SB 25

根据标准8.4.1,函数的声明包括trailing-return-type,类函数定义包含" declarator virt-specifier-seq opt ".第二个,的virt说明符-SEQ是一个finaloverride,所以那些来尾随返回类型.(即Clang说得对.)