编译器无法推断出std :: max的重载

时间:2018-05-29 14:25:37

标签: c++ stl std-function overload-resolution

使用我的编译器

typedef const double&(*fT)(const double&, const double&);
typedef std::function<const double&(const double&, const double&)> std_func;

fT f1 = std::max<double>;                            //(1)
std_func f2 = static_cast<fT>(std::max<double>);     //(2)
std_func f3 = f1;                                    //(3) 

(1,2,3)工作但

auto f4 = std::max<double>;                          //(4)
std_func f5 = std::max<double>;                      //(5) 

(4,5)不要。编译器抱怨它无法为案例5选择重载。

这种行为是正常的吗?

最便携和正确的写作方法是什么?

1 个答案:

答案 0 :(得分:11)

std::max<double>实例化有两种可能的重载:std::max(double, double)std::max(std::initializer_list<double>)。因此,版本4和版本5失败,因为它无法确定哪些过载匹配。

案例1,2和3由于特殊规则而成功 - 当获取过载函数的地址时,结果的类型用于选择正确的过载。