当使用 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/