如果我们看一下成员声明的语法,就会发生这样的事情:
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 ::
?
答案 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