6

此代码被 MSVC9.0 接受。我的问题是根据标准(旧标准和/或新标准)是否合法。报价也会非常受欢迎。

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

2 回答 2

12

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

declarator-id不应被限定,除非

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

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

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

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

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

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

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

于 2011-08-18T18:21:14.260 回答
7

据我了解,根据 C++03 规范,它是无效的。

参考 - C++03 标准:

第 8.3 美元:

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

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

于 2011-08-18T18:21:02.027 回答