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

时间:2011-08-18 18:03:35

标签: c++ c++11 grammar qualified-name member-functions

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

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

2 个答案:

答案 0 :(得分:11)

不,这是无效的。在这里,X::f是一个合格的名称;您正尝试将其用作 declarator-id 。 C ++ 03 8.3 [dcl.meaning] / 1列出了 declarator-id 可能被限定的情况:

  

外, declarator-id 不合格      
      
  • 外部成员函数或静态数据成员的定义   其班级,

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

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

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

  •   

由于X::f不属于这四个类别,因此不正确。

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

  

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

答案 1 :(得分:7)

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

参考 - C ++ 03标准:

第8.3节:

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

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