【发布时间】:2011-03-25 22:04:25
【问题描述】:
以下代码抛出异常
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();
}();
但是,根据the documentation on blocks,
通常,您可以在块中使用 C++ 对象。在成员函数中,对成员变量和函数的引用是通过隐式导入的 this 指针进行的,因此看起来是可变的。如果复制块,有两个注意事项:
如果您有一个 __block 存储类来存储基于堆栈的 C++ 对象,则使用通常的复制构造函数。
如果您在块中使用任何其他基于 C++ 堆栈的对象,则它必须具有 const 复制构造函数。然后使用该构造函数复制 C++ 对象。
这似乎是正常的;如果我将上面的f 替换为带有operator()() 的简单类的实例,则上面的代码将按预期运行。
为什么带有boost::function 的版本不起作用?
【问题讨论】:
-
我不是 boost 专家,但我冒险猜测它与
boost::function<>类型的 const 复制构造函数 相关(根据引用的文档)。 -
在没有绑定调用的情况下是否会出现同样的错误(免费功能不需要,请参阅here)?使用可移植语法 function0 而不是 function 怎么样?
-
我也对
bind()调用感到好奇,这是不必要的,可能是导致错误的原因。 -
@academicRobot,@lefticus - 没有
bind()调用没有区别(而且我的实际情况需要绑定一些参数)
标签: c++ objective-c block objective-c++ boost-function