在将std :: bind与std :: function结合使用时,我无法理解一些细微之处。
我已将问题最小化到以下代码段:
#include <functional>
#include <iostream>
void bar(int x) {
std::cout << "Hello." << std::endl;
}
int main(int argc, char* argv[])
{
std::function<void(int)> f1 = std::bind(bar, std::placeholders::_1);
// CRASHES with clang, works fine in VS2010 and VS2012
std::function<void()> f2 = std::bind(f1, 1);
f2();
return 0;
}
注意显式转换为std :: function&lt;&gt; (在构建std::function<void()>
时,将auto
替换为f2
可以正常工作。
通过在OS X(XCode 5.0.1,OS X 10.9 SDK)上使用Clang复制f2
对象来创建f1
,但在VS2010 / VS2012中可以正常工作。在一个非常长的callstack之后,代码崩溃了一个EXC_BAD_ACCESS - 注意这是构造函数对象时,而不是在调用它时。
这是库实现中的错误还是代码问题?
解决方法是显式调用operator ()
成员,如下所示:
std::function<void()> f2 =
std::bind(&std::function<void(int)>::operator(), f1, 1);
但是这有一个警告,因为它无法在VS2012上编译(但在VS2010中有效)。这似乎是a bug with VS2012。
答案 0 :(得分:2)
您的代码与clang 3.4(trunk,194324)一样正常。它也适用于gcc 4.7.2。
我没有收到-Wall -Wextra -pedantic
的任何警告(除了那些抱怨未使用的x,argc和argv参数的人)。
似乎clang实现过去是错误的,但已被修复。