::* (The pointers to class members)

class A
{
public:
 int i;
 void f(){}
};
int main(void)
{
 int A::*pvar = &A::i;    // (a)
 void (A::*pfunc)() = &A::f;    // (b)
 system("pause");
 return 0;
}

 

在ISO-IEC 14882 (2003)标准上,关于pointers to members的示例都是以"&ClassName::VariableOrFunctionName"的形式来初始化的。

然而在Visual C++ .net 2003中,(a)处写成 int A::*pvar = &(A::i);就无法通过编译,理由是“error C2597: 对非静态成员"A::i"的非法引用”。而(b)处写成int A::*pfunc = &(A::f);却没有问题。

而在标准中对于pointers to members的初始化、赋值表达式右边的规则却没有明确阐述。

困扰,理应只能写成"&ClassName::VariableOrFunctionName"而不可以用"&(ClassName::VariableOrFunctionName)",但却实在想不出有什么理由对variable和function区别看待。

 

续:

这个问题大约也只能从编译器实现逻辑的角度去解释了。对于&(A::f),其中A::f是成员函数,所有类对象都共享一个A::f,在编译器实现时,大约将其看待为与静态成员相类似的东西,于是可以通过&(A::f)的语法;而对于&(A::i),A::i显然是每个对象都有的,于是编译器面对带括号的这种表达式,会认为对非静态成员使用了静态成员的语法了,于是自然无法通过编译。最重要的一点是,编译器对于"&ClassName::VariableOrFunctionName"形式的语法,肯定是做了特别的判断,根据标准,这必定是成员指针,无论是成员变量或成员函数。

于是,得结论,对&(A::f)通过编译是Visual C++ .net 2003的一个bug!...=.=!....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值