std :: bind全局和成员函数之间的语法差异

时间:2015-08-30 05:54:22

标签: c++ c++11

使用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);

我真的不明白这个错误。我本来希望这两个实例要么不需要&,但结果却被区别对待。有人能帮助我理解为什么编译器对这种差异很挑剔吗?

2 个答案:

答案 0 :(得分:2)

如果您在&#34;正常&#34;上使用&函数,你得到一个函数指针。

如果你不使用它并将其传递给std::bind,你实际上是在传递函数的引用;在内部,它会衰减到指向函数的指针并存储。

没有&#34;对成员函数&#34;的引用,仅#34;指向成员函数&#34;的指针,因此您必须使用&运算符。实际上,标准允许在类成员访问表达式中仅使用非静态成员函数的名称1)和2)使用&形成指向成员的指针。

答案 1 :(得分:1)

成员函数需要显式&才能形成指针。这是一个故意设计,它早于std::bind并且应该减少程序员错误。例如这段代码:

Foo;
如果Foo是成员函数,

将导致错误,但如果Foo是自由函数,则它是有效代码。可能是打算调用该功能并忘记括号的人。显然,我们可以制作更复杂的例子。

现在要回归并要求&非成员函数为时已晚,现有的代码太多依赖于&#34;衰变&#34;功能指针。