【问题标题】:G++, clang++ and std::functionG++、clang++ 和 std::function
【发布时间】:2013-03-30 10:17:54
【问题描述】:

我只是在玩 C++11 中的新 std::function,我编写了一个使用 clang++ 3.2 和英特尔 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 也可以编译这两者。

【问题讨论】:

  • 什么错误,g++ 告诉你?
  • clang 3.0 with -std=c++11 crash dumps on this code
  • 'main()::&lt;lambda(int)&gt;' is not derived from 'std::function&lt;typename C::value_type(typename C::value_type)&gt;' 我想,这至少是我得到的。
  • @AndyProwl,你就在那里不应该进行任何类型推导,因为function&lt;typename C::value_type(typename C::value_type)&gt; 是一个非推导上下文,但由于某种原因失败了,但是它适用于std::function&lt;int(int)&gt;,应该是等效的。有关详细信息,请参阅 bugzilla 报告。
  • @JonathanWakely:感谢您再次澄清。您的回答清楚地表明,更改本身仅有助于揭示现有的错误,而不是成为罪魁祸首。 (已经 +1)

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


【解决方案1】:

这是一个 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);
}

我已将其以PR 56874 的身份报告给 bugzilla。该问题与 lambda 无关,而是与非推导上下文中的类型错误地导致参数推导失败有关。

【讨论】:

  • 也可以将评论中关于非推断上下文的部分添加到您的答案中。
  • 顺便说一句,您报告这是特定于 lambdas 的,但在传递函子或函数指针时它也不会编译。这是一个不同的错误还是同一个错误的一部分?
  • @dtruby,我已经更新了上面的答案和 bugzilla 报告:传递 int 时它也不会编译
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
相关资源
最近更新 更多