Я имею в виду, мы всегда знаем тип возвращаемого значения функции, когда пишем ее
А мы? Итак, если вы напишите этот шаблон функции:
template<typename A, typename B>
/* ret */ foo(A a, B b) {
return a + b;
}
Вы можете точно сказать, что такое ret
? Если задано два целых числа, то это, конечно, целое число. Но если указано целое и длинное, оно должно быть длинным из-за рекламных акций. И если один аргумент является двойным, то результатом должно быть двойное два.
А что, если это два объекта некоторых типов классов? Теперь мы вызываем перегруженный operator+
, и совершенно неясно, что он может вернуть.
Надеюсь, теперь вы убеждены, что, говоря, что мы принимаем любые два типа, мы не можемвсегда будьте уверены, какой тип выражения включает в себя эти типы.
Таким образом, к языку был добавлен механизм, чтобы рассказать. Конечно, этот пример слишком прост и, вероятно, заменен типами возврата auto
, но общий принцип остается. При написании универсального кода мы часто имеем дело с неизвестными типами. Практически не известно, каким должен быть тип выражения, в которое они были вовлечены, или даже если выражение, подобное этому, является действительным до , в которой создается функция. decltype
говорит нам об этом.