这似乎不一致.为什么我们使用&Example :: func而不是Example :: func?是否有用于Example :: func或&exampleFunction?看起来我们不能对函数进行引用,因此排除了Example :: func.我想不出一种使用&exampleFunction的方法,因为exampleFunction已经返回一个指针.
#includeclass 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; }
Pieter.. 6
因为这是标准定义函数指针的方式.
实际上,您总是必须使用地址运算符&
来获取指向函数的指针,但对于常规函数和静态成员函数,标准中定义了从函数到指针到函数的隐式转换.
这不是为(非静态)成员函数定义的,因为您无法获得非静态成员函数的左值.
从C++标准:
4.3函数到指针的转换
函数类型T的左值可以转换为"指向T的指针"的右值.结果是指向函数的指针.
脚注52:
此转换从不适用于非静态成员函数,因为无法获取引用非静态成员函数的左值.
我认为,出于一致性的原因,他们宁愿只允许和运作,但隐式转换只是C遗产的一件神器......
因为这是标准定义函数指针的方式.
实际上,您总是必须使用地址运算符&
来获取指向函数的指针,但对于常规函数和静态成员函数,标准中定义了从函数到指针到函数的隐式转换.
这不是为(非静态)成员函数定义的,因为您无法获得非静态成员函数的左值.
从C++标准:
4.3函数到指针的转换
函数类型T的左值可以转换为"指向T的指针"的右值.结果是指向函数的指针.
脚注52:
此转换从不适用于非静态成员函数,因为无法获取引用非静态成员函数的左值.
我认为,出于一致性的原因,他们宁愿只允许和运作,但隐式转换只是C遗产的一件神器......