Впервые в C ++ и изучении из книг, поэтому я могу быть довольно педантичным или миопическим в своих рассуждениях.
В случае с шаблонными функциями я читал, что когда параметр передается с помощью Reference, только преобразования изСсылка / указатель на NonConst для ссылки / указатель на Const разрешены.
Это означает, что я считаю, что
template <typename T> int compare(T&, T&);
должен произойти сбой при вызове сравнения (ci1, ci1), причем ci1 является conntant int, поскольку преобразования для Const в NonCost не разрешены для параметров Reference.
Однако это работает в моем компиляторе (Visual C ++ 10).Может кто-нибудь объяснить мне, что я не так?
template <typename T> int compare(T&, T&);
template <typename T> int compare(T &v1, T &v2)
{
// as before
cout << "compare(T, T)" << endl;
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
const int ci1 = 10;
const int ci2 = 20;
int i1 = 10;
int i2 = 20;
compare(ci1, ci1);
compare(i1, i1);