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

标签 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);

我真的不明白这个错误。我原以为这两个实例都需要 & 或不需要,但结果却对它们进行了不同的处理。谁能帮我理解为什么编译器对这种差异很挑剔?

最佳答案

如果您在“普通”函数上使用 &,您会得到一个指向函数的指针。

如果你不使用它并把它传递给std::bind,你实际上是在传递一个函数的引用;在内部,它已衰减为指向函数的指针并按原样存储。

没有“对成员函数的引用”,只有“指向成员函数的指针”,所以你必须使用&操作符。事实上,该标准仅允许在 1) 类成员访问表达式中使用非静态成员函数的名称,以及 2) 使用 & 形成指向成员的指针。

关于c++ - std::bind 全局函数和成员函数之间的语法差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32293653/

相关文章:

c++ - 检测原始 pcm 数据中的声级

c++ - glOrtho 不工作?

具有显式模板参数的 C++ 函数对象

c++ - C++ 11 mersenne_twister_engine 类的问题

c++ - 有没有办法部分匹配可变参数模板参数包?

c++ - g++4.9 libstdc++ std::string 对 C++11 的支持中断

C++ 后端基础设施

c++ - 临时数组是否可能?

在参数中强制执行单一类型的 C++ 参数包

C++ 参数包,受限于单一类型的实例?