G ++,clang ++和std :: function

时间:2013-04-08 10:53:34

标签: c++ c++11 g++ clang++

我刚刚使用C ++ 11中的新std :: function,我编写了一个使用clang ++ 3.2和Intel C ++编译器13.1编译的示例,但没有使用g ++ 4.8编译。在我将此报告为错误之前,我想我会检查我是不是做了一些非常愚蠢的事情,而且这应该实际编译。 那么,以下代码是否有效c ++ 11?

template <typename C>
void map(C& c, std::function<typename C::value_type(typename C::value_type)> f)
{
    for(auto& x : c) {
        x = f(x);
    }
}

int main()
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    map(v, [](int x) { return x+2; });

    for(auto x : v) {
        std::cout << x << std::endl;
    }
}

我意识到这段代码不是很有用,但我觉得奇怪的是clang和英特尔C ++编译它并且gcc没有编译它。

编辑:当传递map函子或函数指针时,gcc也不会编译相同的代码:

struct {
    int operator() (int a) {
        return a+2;
    }
} add2s;
map(v, add2s);

int add2 (int a) {
    return a+2;
}
map(v,add2);

clang和icpc也会编译这两个。

1 个答案:

答案 0 :(得分:10)

这是一个G ++错误,它可以简化为以下不使用std::function的示例(或标准库中的任何内容):

template<typename T>
struct function
{
    function(int)
    { }
};

struct V {
  typedef int value_type;
};

template <typename C>
void map(C&, function<typename C::value_type>)
{
}

int main()
{
  V v;
  map(v, 1);
}

我已将其报告给bugzilla PR 56874。该问题与lambdas无关,而与非推导上下文中的类型无关,导致参数推断失败。