次のコードは例外をスローします
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_function_call> >'
what(): call to empty boost::function
行でf()
(ブロックの実行中):
void foo(); // assume this is defined somewhere
boost::function<void()> f = boost::bind(&foo);
^(void) {
f();
}();
一般に、ブロック内でC++オブジェクトを使用できます。メンバー関数内では、メンバー変数および関数への参照は、暗黙的にインポートされたこのポインターを介して行われるため、変更可能に見えます。ブロックがコピーされる場合に適用される2つの考慮事項があります。
スタックベースのC++オブジェクトの__blockストレージクラスがある場合は、通常のコピーコンストラクターが使用されます。
ブロック内から他のC++スタックベースのオブジェクトを使用する場合は、constcopyコンストラクターが必要です。次に、そのコンストラクターを使用してC++オブジェクトがコピーされます。
これは通常は正しいようです。f
上記を、を含む単純なクラスのインスタンスに置き換えるとoperator()()
、上記のコードは期待どおりに実行されます。
なぜバージョンが機能しないのboost::function
ですか?