/ / Objective-C ++ブロックでboost ::関数を使用できないのはなぜですか? - c ++、objective-c、ブロック、objective-c ++、boost-function

Objective-C ++ブロックでboost ::関数を使用できないのはなぜですか? - c ++、objective-c、ブロック、objective-c ++、boost-function

次のコードは例外をスローします

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コピーコンストラクタ ブロックスコープにオブジェクトの一部をコピーできませんでした。