这似乎不一致。为什么我们使用&Example::func而不是Example::func? Example::func或&exampleFunction有用途吗?似乎我们无法对函数进行引用,因此可以排除Example::func。而且我想不出使用&exampleFunction的方法,因为exampleFunction已经返回了一个指针。

#include <iostream>
class Example {
public:
    void func() { std::cout <<"print me\n"; }
};
void exampleFunction() { std::cout << "print me too\n"; }
typedef void (Example::*ExampleFunc_t)();
typedef void (*ExampleFunction_t)();
int main()
{
    Example e;
    ExampleFunc_t     f  = &Example::func;
    ExampleFunction_t f2 = exampleFunction;
    (e.*f)();
    f2();
    return 0;
}

最佳答案

因为这就是标准定义函数指针的方式。
实际上,您总是必须使用地址运算符&来获得指向函数的指针,但是对于常规函数和静态成员函数,标准中定义了从函数到指针到函数的隐式转换。
没有为(非静态)成员函数定义此属性,因为您无法获得非静态成员函数的左值。
从C++标准:

脚注52:

我认为出于一致性的原因,他们宁愿只允许&function,但是隐式转换只是C语言遗产的产物。

关于c++ - 在C++中&func或class::func有用途吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/613799/

10-11 19:02