尾随返回类型的“覆盖”限定符在哪里?

Posted

技术标签:

【中文标题】尾随返回类型的“覆盖”限定符在哪里?【英文标题】:Where does the 'override' qualifier go with trailing return types? 【发布时间】:2012-10-07 17:16:08 【问题描述】:

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 所说,这是a bug in gcc (Bugzilla link)。

【问题讨论】:

该问题已在 GCC 4.8 HEAD 分支中修复 :) 【参考方案1】:

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

【讨论】:

谢谢!好像有人报告了这个错误。我正在用链接编辑我的问题。【参考方案2】:

像这样:

class I

    virtual auto Func() -> void = 0;
;

class C : public I

    auto Func() -> void override;
;

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

【讨论】:

以上是关于尾随返回类型的“覆盖”限定符在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

我的指针导致“多次使用相同类型的限定符”警告?

动态加载布局的技巧

java面向对象2

传递参数 1 会丢弃来自指针目标类型的限定符

精通C语言ANSI C 类型限定符const,volatile,restrict,_Atomic

精通C语言ANSI C 类型限定符const,volatile,restrict,_Atomic