Тип возврата шаблона вывода на основе оператора ?: результат - PullRequest
0 голосов
/ 30 января 2019

Рассмотрим этот код:

template <typename T1, typename T2>
auto max(T1 t1, T2 t2) -> decltype(true?t1:t2)
{
  return t2 < t1 ? t1 : t2;
}

При вызове этой функции с помощью ::max(5, 7.2) Я ожидаю, что возвращаемый тип будет int, поскольку decltype(t1) в этом случае int.

Почему выводимый тип возврата double в приведенном выше коде при использовании operator?: внутри decltype?

Если я сделаю -> decltype(t1), я получу ожидаемый тип возврата int.

1 Ответ

0 голосов
/ 30 января 2019

Обратите внимание, что тип результата условного оператора определяется во время компиляции.Он не будет возвращать различные типы в зависимости от условия, но будет возвращать общий тип операндов в качестве результата.

6.2) Если и E2, и E3 имеют арифметический тип или тип перечисления: обычные арифметические преобразования применяются для приведения их к общему типу, и этот тип является результатом.

И для этого случая, т.е. один операнд равен int идругой - double, тип результата будет double.

  • В противном случае, если один из операндов является двойным, другой операнд преобразуется в двойной

Кстати: вы можете использовать std::common_type (начиная с C ++ 11), чтобы получить общий тип.

...