标准中的覆盖和noexcept的顺序

Fro*_*art 7 c++ language-lawyer c++11

是否需要覆盖和noexcept的顺序?

class Base
{
public:
  virtual void foo() {}
};

class Derived : public Base
{
public:
  // virtual void foo() override {} // Ok
  // virtual void foo() noexcept {} // Ok
  // virtual void foo() noexcept override {} // Ok
  virtual void foo() override noexcept {} // Error
};

int main() {}
Run Code Online (Sandbox Code Playgroud)

我正在使用gcc 4.7.2.

Sim*_*ple 6

在8.3.5 [dcl.fct]中我们看到:

D1(parameter-declaration-clause)cv-qualifier-seq opt ref-qualifier opt exception-specification opt attribute-specifier-seq opt

......在9.2 [class.mem]中我们看到:

declarator virt-specifier-seq opt pure-specifier opt

这表明override并且final必须追随noexcept.


Pla*_*aHH 6

实际上,是的,它很难找到,因为它有点分散.附件A(语法摘要)在这方面有所帮助.让我们试着找到具体的位:

declarator:
    ptr-declarator
    noptr-declarator parameters-and-qualifiers trailing-return-type

parameters-and-qualifiers:
    ( parameter-declaration-clause ) attribute-specifier-seqopt cv-qualifier-seqopt
    ref-qualifieropt exception-specificationot

exception-specification:
    dynamic-exception-specification
    noexcept-specification

noexcept-specification:
    noexcept ( constant-expression )
    noexcept
Run Code Online (Sandbox Code Playgroud)

然后是覆盖

member-declarator:
    declarator virt-specifier-seqopt pure-specifieropt
    declarator brace-or-equal-initializeropt
    identifieropt attribute-specifier-seqopt: constant-expression

virt-specifier-seq:
    virt-specifier
    virt-specifier-seq virt-specifier

virt-specifier:
    override
    final
Run Code Online (Sandbox Code Playgroud)

所以声明符是包含noexcept关键字的东西,但是在member-declarator中,virt-specifier出现在声明符之后.


dyp*_*dyp 5

摘自[gram.decl] /A.7,强调我的

声明    符:
   ptr-declarator
noptr-declarator参数和限定符trailing-return-type

ptr-declarator:
   noptr-declarator
   ptr-operator ptr-declarator

noptr-declarator:
   declarator-id attribute-specifier-seq opt
   noptr-declarator parameters-and-qualifiers
   noptr-declarator [constant-expression opt ] attribute-specifier-seq opt
   (ptr-declarator)

parameters-and-qualifiers:
( parameter-declaration-clause ) attribute-specifier-seq opt cv-qualifier-seq opt
ref-qualifier opt exception-specification opt

[gram.class] /A.8,强调我的

member-declarator:
   declarator virt-specifier-seq opt pure-specifier opt
   declarator brace-or-equal-initializer opt
   identifier opt attribute-specifier-seq opt
: constant-expression

virt-specifier-seq:
   virt-specifier
   virt-specifier-seq virt-specifier

VIRT说明符:
   override
   final

也就是说,异常规范声明符的一部分,它位于成员声明中的virt-specifier之前.