Какой тип будет использоваться вместо auto
?
Тип возврата вашей функции определяется типом выражения в единственном операторе return
.В вашем случае это утверждение:
return context != nullptr ? maybe(evaluator(context)) : nullptr;
Возвращаемое выражение является троичным оператором, два потенциальных значения которого имеют разные типы (Maybe<C>
, для некоторого класса C
необязательно T
и nullptr_t
).Это правильно, только если один из типов неявно конвертируется в другой.Обычно nullptr_t
преобразует только в / из других типов указателей, поэтому давайте посмотрим на неявные преобразования, определенные для Maybe
(есть только один):
Maybe(T *context) : context(context) { }
Тип указателя может быть преобразован в Maybe
.Таким образом, nullptr
преобразуется в C*
, который затем преобразуется в Maybe<C>
объект (контекст которого равен нулю).Опять же, я использую C
вместо T
, потому что этот тип не обязательно должен быть тем же параметром шаблона, который является частью типа *this
.Возвращаемый тип является одинаковым независимо от значения context
.
Если вы хотите увидеть этот неявный разрыв преобразования, сделайте преобразование в Maybe
явное, как в explicit Maybe(T *context) : context(context) { }
.