2016-11-30 6 views
1

В чем разница между вызовами A, B и C?Какая разница между вызовом шаблона?

#include <iostream> 

using namespace std; 

template<class T> T max(T a, T b) { 
    return (a >= b) ? a : b; 
} 

int main() { 
    float a = 4.0; 
    float b = 6.0f; 
    cout << max(a, b) << endl; //A 
    cout << max<double>(a, b) << endl; //B 
    cout << max<double>(4.0, 6.0f) << endl; //C 
} 
+0

Те же вещи, за исключением возвращаемого значения и некоторого неявного преобразования (поплавка -> двойной) – Fefux

+0

Это как вы узнали, что генерируется функция: Для функции добавьте следующую строку: 'станд :: соиЬ << (__PRETTY_FUNCTION__) << std :: endl; ' –

ответ

2

Первый вызов max фактически max<float>, второй и третий такой же max<double>

Но во втором вызове как a и b получить повышение в два раза, причем в третьем примере только 6.0f способствует удвоится ,

-1

A вызывает std::max<float>, так как a и b являются аргументами с плавающей запятой. В B и C вы вынуждаете его вызывать std::max<double>, поэтому оба аргумента преобразуются в double.