标准是否需要覆盖和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。
答案 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
这表明override
和final
必须在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出现在声明符之后。