Все зависит от предположений, которые вы можете сделать с типом.
template <typename T> T sum( T a, T b, T c = T() ) { return a+b+c; }
template <typename T> T sum2( T a, T b, T c = T(5) ) { return a+b+c; }
В первом случае предполагается, что T
является конструируемым по умолчанию.Для типов POD это значение инициализации значения (IIRC) и в основном 0
, поэтому sum( 5, 7 )
вызовет sum( 5, 7, 0 )
.
Во втором случае вам требуется, чтобы тип мог быть построен из целого числа.Для целочисленных типов sum( 5, 7 )
вызовет sum( 5, 7, int(5) )
, что эквивалентно sum( 5, 7, 5 )
.