Функции шаблона и справочные параметры Const / NonConst - PullRequest
3 голосов
/ 04 апреля 2011

Впервые в 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);  

Ответы [ 5 ]

3 голосов
/ 04 апреля 2011

Вызов

compare( ci1, ci1 );

возвращает T как тип const int (в вашей предпочтительной записи).

Тогда эффективная сигнатура функции

int compare( int const&, int const& )

Youможно использовать typeid(x).name(), чтобы проверить, какие типы у вас есть на самом деле.

Примечание: с g ++, который выдает некоторые неиспользуемые короткие формы, которые затем вам нужно использовать для декодирования специальной функции g ++, специфичной для g ++,

Приветствия и hth.

2 голосов
/ 04 апреля 2011

В первом случае шаблон создается с T = const int, что нормально.

Если вы попробуете compare(i1, ci1), вы получите сообщение об ошибке, так как не найдет аргумент шаблона, совместимый сint & и const int &.Изменение подписи на compare(const T &, const T &) решит эту проблему.

2 голосов
/ 04 апреля 2011

T будет любым типом переменной - в вашем случае const int, поэтому окончательная реализация compare будет выглядеть как

// T = const int
int compare(const int& v1, const int& v2)

в вашем первом случае с compare(ci1,ci2) и как

// T = int
int compare(int& v1, int& v2)

с compare(i1,i2).

1 голос
/ 04 апреля 2011

Это приемлемо, потому что функция может быть создана при замене int const на T.

1 голос
/ 04 апреля 2011

В случае сравнения (ci1, ci1);T будет const int.Вот почему это работает

...