编译器无法推断 std::max 的重载
compiler cannot deduce overload of std::max
用我的编译器
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 选择重载。
这种行为正常吗?
最便携最正确的写法是什么?
std::max<double>
的实例化有两种可能的重载:std::max(double, double)
和 std::max(std::initializer_list<double>)
。因此,版本 4 和 5 失败,因为它无法确定哪个重载匹配。
案例 1、2 和 3 由于特殊规则而成功 - 当获取重载函数的地址时,结果类型用于 select 正确的重载。
用我的编译器
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 选择重载。
这种行为正常吗?
最便携最正确的写法是什么?
std::max<double>
的实例化有两种可能的重载:std::max(double, double)
和 std::max(std::initializer_list<double>)
。因此,版本 4 和 5 失败,因为它无法确定哪个重载匹配。
案例 1、2 和 3 由于特殊规则而成功 - 当获取重载函数的地址时,结果类型用于 select 正确的重载。