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

时间:2013-11-20 13:43:36

标签: c++ xcode c++11 clang

在将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

1 个答案:

答案 0 :(得分:2)

您的代码与clang 3.4(trunk,194324)一样正常。它也适用于gcc 4.7.2。

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

似乎clang实现过去是错误的,但已被修复。