std::bind(&Foo:foo, std::ref(object)); 其中,foo为Foo类的成员函数名,object为Fool类的对象
按照&运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来&test是非法的,但很久以前有些编译器已经允许这样做,c/c++标准的制定者出于对象的概念已经有所发展的缘故,也承认了&test的合法性。
因此,对于test和&test你应该这样理解,test是函数的首地址,它的类型是void (),&test表示一个指向函数test这个对象的地址,它的类型是void (*)(),因此test和&test所代表的地址值是一样的,但类型不一样。test是一个函数,&test表达式的值是一个指针!
跟此问题类似的还有对一个数组名取地址。
标准在其rationale中解释了这个问题,摘录如下:
6.5.3.2 Address and indirection operators
Some implementations have not allowed the & operator to be applied to an array or a function.
(The construct was permitted in early versions of C, then later made optional.) The C89 Language
Committee endorsed the construct since it is unambiguous, and since data abstraction is
enhanced by allowing the important & operator to apply uniformly to any addressable entity.
https://bbs.youkuaiyun.com/topics/310105530
本文详细解析了C++中&运算符应用于函数名的合法性和意义,阐述了test和&test的区别,即前者是函数首地址,后者是指向函数的指针,两者虽指向同一地址但类型不同。
3624

被折叠的 条评论
为什么被折叠?



