无法使用std :: map推导出lambda的返回类型

时间:2017-01-02 21:57:52

标签: c++ c++11 lambda

这是一个奇怪的案例。

  • 以下代码在使用用户定义类型时会产生错误,但在使用基元时则不会产生错误!
  • 使用 std :: map (也是QMap)产生错误,但如果用 std :: pair (也是QPair)替换则不会错误!

为什么吗

我正在使用 MSVC 2013

background-image

1 个答案:

答案 0 :(得分:1)

这里发生的是,在MSVC 2013及更早版本中,std :: result_of模板返回的是const Class,而不仅仅是Class。这导致地图的值类型不可复制。

通过将typedef double Type更改为typedef const double Type,您可以看到完全相同的问题。

如果仍然需要使用非C ++ 11兼容库,则可以将lambda的返回类型指定为Type,但这将涉及副本。

或者,删除constness但更改: typename std::result_of<ValueFunctor(T)>::type

typename std::remove_const<typename std::result_of<ValueFunctor(T)>::type >::type

    template<typename T, typename ValueFunctor>
std::map<int, typename std::remove_const<typename std::result_of<ValueFunctor(T)>::type >::type>
    testFun(ValueFunctor valueFunctor)
{
    std::map<int, typename std::remove_const<typename std::result_of<ValueFunctor(T)>::type>::type > map;

    return map;
}