首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >成员函数指针的奇怪C++规则?

成员函数指针的奇怪C++规则?
EN

Stack Overflow用户
提问于 2011-08-20 19:51:24
回答 2查看 2.1K关注 0票数 22

可能重复:

Error with address of parenthesized member function

this recent question中,OP遇到了C++语言中一个奇怪的条款,如果该成员函数名是括号,则获取该成员函数的地址是非法的。例如,此代码是非法的:

代码语言:javascript
复制
struct X {
    void foo();
};

int main() {
    void (X::* ptr)();
    ptr = &(X::foo);   // Illegal; must be &X::foo
}

我查了一下,发现这是C++ ISO规范第5.3.1/3节的原因,该规范内容如下:

指向成员的指针只有在使用显式&且其操作数是限定id而不是括在括号内时才会形成.

有谁知道为什么规范有这个规则吗?它是特定的指针到成员,所以我怀疑有一些语法模糊,这解决了,但老实说,我不知道它可能是什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-20 22:06:46

这只是个人意见。如果&(qualified-id)被允许为&(unary-expression),那么限定-id必须是一个表达式,并且表达式应该有一个类型(即使它是不完整的)。但是,C++没有表示成员的类型,只有指向成员的指针。例如,无法编译下列代码。

代码语言:javascript
复制
struct A { int i; };

template< class T > void f( T* );

int main() {
  (void) typeid( A::i );
  f( &A::i );
}

为了使&(qualified-id)有效,编译器必须在内部保存一个成员类型。但是,如果我们放弃&(qualified-id)表示法,编译器就不需要处理成员类型。由于成员类型总是以指向它的指针的形式处理,我想标准会优先简化编译器的类型系统。

票数 27
EN

Stack Overflow用户

发布于 2011-08-21 13:43:34

想象一下这段代码:

代码语言:javascript
复制
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只是保留了这个标准前的概念,并明确地提到了括号使您不能得到指向成员的指针。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7134261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档