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中找到:
如果成员函数的定义在词法定义之外是词法定义,则成员函数名称应使用
::运算符通过其类名限定.
据我所知,它根据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).
我希望我得出上述的适当含义.我会承认阅读和理解标准中的引用让我有点头晕.如果我错误地解释它,请告诉我.
| 归档时间: |
|
| 查看次数: |
11692 次 |
| 最近记录: |