34

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

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

编辑:正如 Kerrek SB 所指出的,这是gcc (Bugzilla link) 中的一个错误

4

2 回答 2

27

根据标准 8.4.1,函数的声明符包含trailing-return-type,类函数定义包含“ declarator virt-specifier-seq opt ”。第二个,virt-specifier-seq,是finalor之一override,所以它们尾随返回类型之后。(即 Clang 做对了。)

于 2012-10-07T17:22:16.033 回答
1

像这样:

class I
{
    virtual auto Func() -> void = 0;
};

class C : public I
{
    auto Func() -> void override;
};

它从 4.8.1 开始在 gcc 中工作:
https ://godbolt.org/z/TbTTwa

于 2019-03-15T08:59:49.257 回答