次のコードは例外をスローします
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 ++スタックベースのオブジェクトを使用する場合は、constコピーコンストラクタが必要です。そのコンストラクタを使用してC ++オブジェクトがコピーされます。
これは通常通りです。私が交換したら f
単純なクラスのインスタンスを operator()()
、上記のコードは期待通りに動作します。
なぜバージョンがないの? boost::function
作業?
回答:
回答№1は1宣言を次のように変更すると __block
それは正しく動作します:
__block boost::function<void()> f = boost::bind(&foo);
私はまだこれがなぜなのかわからない - @リチャード上記のコメントでは、 "通常のコピーコンストラクター"ではなく、 "constコピーコンストラクター"と関係がなければなりません。しかし、この違いをチェックする方法はわかりません;次の作業はうまくいきます:
const boost::function<void()> f = boost::bind(&foo);
const boost::function<void()> g(f);
g();
それが "constコピーコンストラクタ"を呼び出さなければ、私は何をするのか分かりません。
回答№2の場合は0
あなたの答えの例は、
const boost::function<void()> f = boost::bind(&foo);
const boost::function<void()> g(f);
g();
あなたが operator()
その呼び出し先が作成されたのと同じスコープ内にあります。 f()
ブロックスコープの外側でも動作し、 foo()
これは古典的な関数であり、呼び出されたときには「変更された」とみなされないため、ブロックスコープ内で動作します。参照された constコピーコンストラクタ スコープを含むスコープからブロックスコープにオブジェクトを渡すときに行われます。どんな違いがあっても constコピーコンストラクタ ブロックスコープにオブジェクトの一部をコピーできませんでした。