是否允许在成员函数声明中使用限定名称?

Arm*_*yan 6 c++ grammar member-functions qualified-name c++11

MSVC9.0接受此代码.我的问题是它是否符合标准(旧的和/或新的).引用也非常受欢迎.

class X
{
   void X::f();
};
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 12

不,这是无效的.这X::f是一个合格的名字; 您试图将其用作声明者ID.C++ 03 8.3 [dcl.meaning]/1列出了声明者id可能被限定的情况:

一个声明符-ID不得除了合格

  • 在其类之外定义成员函数或静态数据成员,

  • 命名空间的函数或变量成员的定义或显式实例化,或者

  • 先前在其命名空间之外声明的显式特化的定义,或

  • 友元函数的声明,是另一个类或命名空间的成员.

因为不X::f属于这四个类别,所以它是不正确的.

要求限定类定义之外的成员函数的规则可以在C++ 03 9.3 [class.mfct]/5中找到:

如果成员函数的定义在词法定义之外是词法定义,则成员函数名称应使用::运算符通过其类名限定.


Alo*_*ave 7

据我所知,它根据C++ 03规范无效.

参考 - C++ 03标准:

第8.3节:

每个声明符只包含一个declarator-id; 它命名声明的标识符.除了一些特殊函数(12.3,12.4,13.5)的声明以及模板特化或部分特化(14.7)的声明之外,declarator-id的id-expression应该是一个简单的标识符.除了在其类之外的成员函数(9.3)或静态数据成员(9.4)或嵌套类(9.7)的定义,函数,变量或类成员的定义或显式实例化之外,declarator-id不应被限定命名空间之外的命名空间,或者在其命名空间之外的先前声明的显式特化的定义,或者是另一个类或命名空间的成员的友元函数的声明(11.4).

我希望我得出上述的适当含义.我会承认阅读和理解标准中的引用让我有点头晕.如果我错误地解释它,请告诉我.