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

jim*_*iki 9 c++ stl overload-resolution std-function

用我的编译器

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) 
Run Code Online (Sandbox Code Playgroud)

(1,2,3)工作但是

auto f4 = std::max<double>;                          //(4)
std_func f5 = std::max<double>;                      //(5) 
Run Code Online (Sandbox Code Playgroud)

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

这种行为是否正常?

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

Ser*_*eyA 11

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

情况1,2和3由于特殊规则而成功 - 当获取过载函数的地址时,结果的类型用于选择适当的过载.