std :: bind到std :: function与Clang崩溃

vil*_*pam 7 c++ xcode clang c++11

将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;
}
Run Code Online (Sandbox Code Playgroud)

注意显式转换到std ::函数<>(代替std::function<void()>auto施工时f2工作正常).

f2通过f1在OS X(XCode 5.0.1,OS X 10.9 SDK)上使用Clang 复制对象崩溃创建,但与VS2010/VS2012一起正常工作.在一个非常长的callstack之后,代码崩溃了一个EXC_BAD_ACCESS - 注意这是在构造函数对象时,而不是在调用它时.

这是库实现中的错误还是我的代码有问题?

解决方法是显式调用operator ()成员,如下所示:

std::function<void()> f2 =
    std::bind(&std::function<void(int)>::operator(), f1, 1);
Run Code Online (Sandbox Code Playgroud)

但这有一个警告,因为它无法在VS2012上编译(但在VS2010中有效).这似乎是VS2012的一个错误.

Ali*_*Ali 2

您的代码与 clang 3.4 (trunk, 194324) 一起工作得很好。它也适用于 gcc 4.7.2。

我没有收到任何警告-Wall -Wextra -pedantic(除了那些抱怨未使用的 x、argc 和 argv 参数的警告)。

看起来 clang 的实现在过去是有问题的,但现在已经被修复了。