尾随返回类型的“覆盖”限定符在哪里?
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,是final
或override
之一,所以它们在尾随返回类型之后。 (即 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
【讨论】:
以上是关于尾随返回类型的“覆盖”限定符在哪里?的主要内容,如果未能解决你的问题,请参考以下文章