允许的成员函数声明中的限定名

Is qualified name in the member function declaration allowed?

本文关键字:函数 成员 声明      更新时间:2023-10-16

此代码被MSVC9.0接受。我的问题是,根据标准(旧的和/或新的),它是否合法。如能提供报价,我也非常感谢。

class X
{
   void X::f();
};

不,这是无效的。这里,X::f是限定名;您试图将其用作声明符id。c++ 8.3 (dcl 03。含义]/1列出声明符id可能符合条件的情况:

外,声明符id不限定
  • 外部成员函数或静态数据成员的定义

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

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

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

因为X::f不属于这四种类别,所以是不正确的。

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

中找到。

如果成员函数的定义在词法上超出其类定义,则成员函数名应使用::操作符由其类名限定。

根据c++ 03规范,无效

参考- c++ 03标准:

一节8.3美元:

每个声明符只包含一个声明符id;它为声明的标识符命名。除了一些特殊函数的声明(12.3,12.4,13.5)和模板特化或部分特化的声明(14.7)之外,声明器id的id表达式应该是一个简单的标识符。 declarator-id不得限定除了成员函数的定义(9.3)或(9.4)或嵌套类静态数据成员(9.7)在它的类之外,的定义或显式实例化一个函数,变量或类成员以外的一个名称空间的名称空间,或者先前宣布的定义明确的专业化以外的名称空间,或者一个朋友函数的声明这是一个另一个类的成员或命名空间(11.4)。

我希望我得到了以上的适当含义。我承认我读过。理解《标准报》上的引语让我有点头晕。如果我理解错了,请告诉我。