使用std::bind
时,为什么我必须在成员函数之前指定&
,而不是在全局函数之前?例如,我的main.cpp是:
1 #include <functional>
2
3 class Foo
4 {
5 public:
6 void Exec(void) {}
7 };
8
9 void Exec(void) {}
10
11 int main(void)
12 {
13 Foo inst;
14 auto blah1 = std::bind(Exec);
15 //auto blah2 = std::bind(Foo::Exec, &inst);
16 auto blah2 = std::bind(&Foo::Exec, &inst);
17 blah1();
18 blah2();
19 return 0;
20 }
这个编译很好,但如果我取消注释15和评论第16行,我得到:
$ g++ main.cpp -o a.out -std=c++11 -Wall
main.cpp: In function ‘int main()’:
main.cpp:15:31: error: invalid use of non-static member function ‘void Foo::Exec()’
auto blah2 = std::bind(Foo::Exec, &inst);
我真的不明白这个错误。我本来希望这两个实例要么不需要&
,但结果却被区别对待。有人能帮助我理解为什么编译器对这种差异很挑剔吗?
答案 0 :(得分:2)
如果您在&#34;正常&#34;上使用&
函数,你得到一个函数指针。
如果你不使用它并将其传递给std::bind
,你实际上是在传递函数的引用;在内部,它会衰减到指向函数的指针并存储。
没有&#34;对成员函数&#34;的引用,仅#34;指向成员函数&#34;的指针,因此您必须使用&
运算符。实际上,标准允许在类成员访问表达式中仅使用非静态成员函数的名称1)和2)使用&
形成指向成员的指针。
答案 1 :(得分:1)
成员函数需要显式&
才能形成指针。这是一个故意设计,它早于std::bind
并且应该减少程序员错误。例如这段代码:
Foo;
如果Foo
是成员函数,将导致错误,但如果Foo
是自由函数,则它是有效代码。可能是打算调用该功能并忘记括号的人。显然,我们可以制作更复杂的例子。
现在要回归并要求&
非成员函数为时已晚,现有的代码太多依赖于&#34;衰变&#34;功能指针。