G++, clang++ and std::function

G++, clang++ and std::function

本文关键字:function std and clang++ G++      更新时间:2023-10-16

我只是在摆弄c++ 11中的新std::函数,我写了一个例子,可以用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和Intel c++编译了它,而gcc没有。

EDIT: gcc也不会在向map传递函数函数或函数指针时编译相同的代码:

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

clang和icpc也可以编译这两个文件

这是一个g++ bug,它可以简化为以下不使用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无关,而是与非推导上下文中的类型错误导致参数推导失败有关。