void foo();
class Foomatic() {
void bar();
void baz()
{
std::thread a(foo); // this compiles
std::thread b(Foomatic::bar, this); // this doesn't
std::thread c(&Foomatic::bar, this); // and this compiles
// ...
}
};
我知道成员函数指针的正确语法是&Foomatic::bar
。
但是,为什么Foomatic::bar
不正确呢?那一个返回什么?为什么正确才是&Foomatic::bar
正确的呢?对我来说似乎违反直觉。
这不是重复项。您链接到的问题将回答正确的语法,而不是解释其原因。
我在问为什么C ++在这里如此不一致,我已经知道语法是什么。
C ++从C继承了从函数到函数指针的转换:在C语言中,您只需将函数名称分配给函数指针即可,而无需获取地址。函数名称到函数指针的这种“衰减”似乎是不明智的,并且确实在C中引起了一些混乱。
当引入成员的指针时,不需要与C向后兼容:C没有成员的指针。因此,可以选择不进行从成员名称到成员指针的隐式转换。由于可以在以后觉得有必要但很难删除某个设施的情况下可以添加它,因此选择了不进行从成员名称到成员指针的隐式转换。
由于有一个合理一致的接口来获取函数的指针,成员的指针和对象的指针,因此似乎不需要从成员名到成员的隐式转换,因为从指向对象的指针的对象名称。
在语义上,类似这样的内容T::member
是对成员的引用,而不是对成员的指针。但是,我认为不可能用当前的规范表述这种类型。将来的标准可能会为此语法定义某种形式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句