可能重复:
Error with address of parenthesized member function
在this recent question中,OP遇到了C++语言中一个奇怪的条款,如果该成员函数名是括号,则获取该成员函数的地址是非法的。例如,此代码是非法的:
struct X {
void foo();
};
int main() {
void (X::* ptr)();
ptr = &(X::foo); // Illegal; must be &X::foo
}我查了一下,发现这是C++ ISO规范第5.3.1/3节的原因,该规范内容如下:
指向成员的指针只有在使用显式&且其操作数是限定id而不是括在括号内时才会形成.
有谁知道为什么规范有这个规则吗?它是特定的指针到成员,所以我怀疑有一些语法模糊,这解决了,但老实说,我不知道它可能是什么。
发布于 2011-08-20 22:06:46
这只是个人意见。如果&(qualified-id)被允许为&(unary-expression),那么限定-id必须是一个表达式,并且表达式应该有一个类型(即使它是不完整的)。但是,C++没有表示成员的类型,只有指向成员的指针。例如,无法编译下列代码。
struct A { int i; };
template< class T > void f( T* );
int main() {
(void) typeid( A::i );
f( &A::i );
}为了使&(qualified-id)有效,编译器必须在内部保存一个成员类型。但是,如果我们放弃&(qualified-id)表示法,编译器就不需要处理成员类型。由于成员类型总是以指向它的指针的形式处理,我想标准会优先简化编译器的类型系统。
发布于 2011-08-21 13:43:34
想象一下这段代码:
struct B { int data; };
struct C { int data; };
struct A : B, C {
void f() {
// error: converting "int B::*" to "int*" ?
int *bData = &B::data;
// OK: a normal pointer
int *bData = &(B::data);
}
};如果没有带括号的技巧,您将无法直接获取指向B的数据成员的指针(您需要基类转换和使用this的游戏--不太好)。
从手臂上:
注意,必须显式地使用address-of运算符来获取指向成员的指针;没有隐式转换.如果有,我们在成员职能的范围内就会有一个模糊.例如,
空B::f() { int B:*p= & B::i;// OK p= B::i;//错误:B::i是int p= &i;//错误:‘&i’指的是' int *‘int *>i’,它是‘int*’int *q = &i;// OK q= B::i;// error:'B::i是int q=&B:&B:i;// error:'&B::i‘是'int B::*’}
IS只是保留了这个标准前的概念,并明确地提到了括号使您不能得到指向成员的指针。
https://stackoverflow.com/questions/7134261
复制相似问题