功能C ++ 11奇怪的行为

时间:2015-08-28 10:22:22

标签: c++ pointers c++11 function-pointers

为什么这行不能编译:

function<const int&(const int&, const int&)> min_ptr = min<int>;

但这很好用:

const int &(*min_ptr)(const int&, const int&) = min<int>;

似乎函数类是灵活且舒适的替换函数指针。但为什么这种情况不起作用?

修改即可。我的代码:

#include <functional>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    const int&(*min_ptr)(const int&, const int&) = min<int>; //It is works fine
    function<const int&(const int &, const int&)> min_f = min<int>;// Doesn't compile
    /*
       Error message:
        error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type 
        ‘std::function<const int&(const int&, const int&)>’ requested function<const int&(const int &, const int&)> min_f = min<int>;
    */
    return 0;
}

gcc版本4.8.2, - std = c ++ 11

1 个答案:

答案 0 :(得分:9)

分配到

const int &(*min_ptr)(const int&, const int&)

还会将min<int>转换为特定签名。对std::function的强制转换不会。

添加

 static_cast<const int &(*)(const int&, const int&)>

std::function分配以使其发挥作用。

auto* min_ptr = min<int>;

也无法正常工作。

要考虑min<int>多个重载。

std::function<const int&(const int &, const int&)> min_ptr =
  [](auto&&...args)->decltype(auto){
    return min<int>(decltype(args)(args)...);
  };

也适用于C ++ 14。