компилятор не может вывести перегрузку std :: max - PullRequest
0 голосов
/ 29 мая 2018

С моим компилятором

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 голосов
/ 29 мая 2018

Существует две возможные перегрузки экземпляров std::max<double>: std::max(double, double) и std::max(std::initializer_list<double>).Из-за этого версии 4 и 5 терпят неудачу, так как он не может выяснить, какая перегрузка соответствует.

Случаи 1, 2 и 3 выполняются успешно из-за специальных правил - при получении адреса функции перегрузки, типрезультат используется для выбора правильной перегрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...