簡體   English   中英

為什么我不能在Objective-C ++塊中使用boost :: function?

[英]Why can't I use a boost::function in an Objective-C++ block?

以下代碼拋出異常

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 ++對象。 在成員函數中,對成員變量和函數的引用是通過隱式導入的this指針,因此看起來是可變的。 如果復制塊,則有兩個注意事項:

  • 如果你有一個基於堆棧的C ++對象的__block存儲類,那么使用通常的復制構造函數。

  • 如果在塊中使用任何其他基於C ++堆棧的對象,則它必須具有const復制構造函數。 然后使用該構造函數復制C ++對象。

這通常是正確的; 如果我用一個帶有operator()()的簡單類的實例替換上面的f ,則上面的代碼按預期運行。

為什么帶有boost::function的版本不起作用?

看來如果我用__block修改聲明,它可以正常工作:

__block boost::function<void()> f = boost::bind(&foo);

我仍然不確定為什么會這樣 - 正如@Richard在上面的評論中提到的,它必須與“const拷貝構造函數”相對,而不是“通常的拷貝構造函數”。 不過,我不知道如何檢查這種差異; 以下工作正常:

const boost::function<void()> f = boost::bind(&foo);
const boost::function<void()> g(f);
g();

如果不調用“const復制構造函數”,我不確定會是什么。

你的答案中的例子,

const boost::function<void()> f = boost::bind(&foo);
const boost::function<void()> g(f);
g();

因為您在創建其被調用operator()的同一范圍內調用operator()而起作用。 f()也可以在塊作用域之外工作,並且調用foo()將在塊作用域內工作,因為它是一個經典函數,並且在調用時不被視為“修改”。 在將對象從包含范圍傳遞到塊范圍時,會引用對const復制構造函數的引用。 似乎const復制構造函數中存在的任何差異都無法將對象的一部分復制到塊作用域。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM