10

以下代码:

struct X
{
    void f() {}

    void g()
    {
        auto h = &f;
    }
};

结果是:

error: ISO C++ forbids taking the address of an unqualified
or parenthesized non-static member function to form a pointer
to member function.  Say ‘&X::f’

我的问题是,为什么标准不允许和禁止这样做?作为用户引用它不合格会更方便,所以我认为这个要求还有一些其他的理由(安全性?歧义?易于编译器实现?)?

4

2 回答 2

7

指向成员的指针非常罕见,可以进行特殊处理,但不一定是最经济的。决定唯一接受的形式是错误消息中引用的形式。这种形式在任何情况下都不会与其他任何东西发生冲突。并防止歧义,更宽松的形式被允许。

实践表明,人们对 PTMF 知之甚少,而且它们与功能有着根本的不同。f 或 &f 可能是对正常功能的请求。不能为非静态成员服务的。而那些真正意味着 PTMF 的人会说添加 &X:: 部分。

于 2013-06-02T03:10:39.470 回答
0

您正在获取成员函数的地址,而不是函数,这意味着您也必须以不同的方式调用它。

struct X
{
    void f() {}

    void g()
    {
        auto h = &X::f;
        h();
    }
};

产生:

错误:必须使用 '.*' 或 '->*' 来调用 'h (...)' 中的指向成员函数,例如 '(... ->* h) (...)'
于 2013-06-02T05:45:08.763 回答