1

bind各呼び出しで異なるパラメーター タイプを使用しているにもかかわらず、両方のバージョンが問題なくコンパイルおよび動作するのはなぜですか?

  1. バージョン 1 -> パラメータ foo vs.
  2. バージョン 2 -> foo のパラメーター アドレス

バージョン 1 でコンパイル エラーが発生することを期待していました...


#include <iostream>
#include <functional>

using namespace std;

class Test   
{   
public:
   bool doSomething(){ std::cout << "xxx"; return true;};   
};

int main() {

Test foo;

// Version 1 using foo
std::function<bool(void)> testFct = std::bind(&Test::doSomething, foo);

// Version 2 using &foo
std::function<bool(void)> testFct2 = std::bind(&Test::doSomething, &foo);

testFct();
testFct2();

return 0;
}
4

1 に答える 1

1
std::function<bool(void)> testFct = std::bind(&Test::doSomething, foo);

これは のコピーにバインドしfoo、関数を として呼び出しますcopy.doSomething()foo関数がそれ自体で呼び出されることを期待している場合、これは間違っていることに注意してください。

std::function<bool(void)> testFct2 = std::bind(&Test::doSomething, &foo);

これは へのポインタにバインドしfoo、関数を as として呼び出しますpointer->doSomething()foo関数を呼び出す前に が破棄されていると、これが間違っていることに注意してください。

バージョン 1 でコンパイル エラーが発生することを期待していました...

必要に応じて、コピー不可にすることでこの動作を禁止できTestます。

于 2013-09-11T11:50:49.623 に答える