为什么不允许对成员函数的内联定义进行额外限定?

时间:2014-12-06 14:07:34

标签: c++ language-lawyer

如果我们看一下成员声明的语法,就会发生这样的事情:

member-declaration:
       function-definition ;

function-definition:
       attribute-specifier-seqopt decl-specifier-seqopt declarator 
       virt-specifier-seqopt function-body

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

这不允许使用语法:

struct B {
    A B::*B::read();
};

为什么它不允许在函数名之前使用可选的nested-name-specifier ::

1 个答案:

答案 0 :(得分:4)

语法并不禁止声明由 nested-name-specifier 命名的实体。
事实上,它必须 - 用于friend声明:

class A
{
     friend void OtherNamespace::foo();
};

这是一个带有声明说明符friend成员声明。它通过(大胆强调我的)覆盖:

  

member-declaration
attribute-specifier-seq opt decl-specifier-seq opt member-declarator-list opt ;

  

member-declarator
声明者 virt-specifier-seq opt < / sub> pure-specifier opt

现在,声明者具有以下语法:

  

声明符
    PTR声明符

     

PTR声明符
    noptr声明符

     

noptr声明符
   声明符-ID

     

声明符-ID
   ... opt id-expression

最后,id-expression是

  

id-expression
qualified-id