标准中的覆盖和noexcept的顺序

时间:2014-02-05 12:34:58

标签: c++ c++11 language-lawyer

标准是否需要覆盖和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() {}

我正在使用gcc 4.7.2。

3 个答案:

答案 0 :(得分:5)

在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

这表明overridefinal必须在noexcept之后。

答案 1 :(得分:5)

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

  

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

     

PTR声明符:
  的 noptr声明符
  ptr-operator ptr-declarator

     

noptr-declarator:
declarator-id   attribute-specifier-seq opt
noptr-declarator   参数和限定符
noptr-declarator [   constant-expression opt ] attribute-specifier-seq opt
  (ptr-declarator)

     

参数和限定符:
( parameter-declaration-clause )   属性说明符-SEQ <子>选择   cv-qualifier-seq opt
ref-qualifier opt   的异常规范 <子>选择

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

  

member-declarator:
声明者virt-specifier-seq opt pure-specifier opt < /子>
  declarator brace-or-equal-initializer opt
  标识符 opt attribute-specifier-seq opt
:   常数表达式

     

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

     

virt-specifier:
override
  final

也就是说, exception-specification 声明符的一部分,它位于成员的 virt-specifier 之前-declarator

答案 2 :(得分:5)

实际上,是的,它很难找到,因为它有点分散。附件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

然后再覆盖

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

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