在使用std::bind
时,我发现对于成员函数,需要加上&
才能获得其地址,而对于普通函数则不需要,例如:
class Obj{
public:
void member_func(int val);
};
void func(int val);
int main(){
Obj obj;
auto mf1 = std::bind(&Obj::member_func, &obj, 1); // ok
auto mf2 = std::bind(Obj::member_func, &obj, 1); // error
auto f1 = std::bind(&func, 1); // ok
auto f2 = std::bind(func, 1); // ok
}
在进行STFW
(搜索友好的网页 :) )之后,我在cpp reference中找到了以下内容:
T 类型的函数类型的 lvalue 可以被隐式转换为指向该函数的 prvalue 指针。这不适用于非静态成员函数,因为引用非静态成员函数的 lvalue 不存在。
这解释了为什么成员函数需要使用 &
,但我仍然不完全理解为什么没有对成员函数指针进行隐式转换?
特别是,“引用非静态成员函数的 lvalue 不存在”是什么意思?
"函数类型的 lvalue"
也让我感到困惑,这是不是意味着函数标识符 func
是一个 lvalue?
第一次提问,希望我已经清晰地表达了我的问题。