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.
在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
.
实际上,是的,它很难找到,因为它有点分散.附件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出现在声明符之后.
摘自[gram.decl] /A.7,强调我的
声明 符:
ptr-declarator
noptr-declarator参数和限定符trailing-return-typeptr-declarator:
noptr-declarator
ptr-operator ptr-declaratornoptr-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-expressionvirt-specifier-seq:
virt-specifier
virt-specifier-seq virt-specifierVIRT说明符:
override
final
也就是说,异常规范是声明符的一部分,它位于成员声明符中的virt-specifier之前.