Почему шаблоная функция same возвращает true при разных типах?

Рейтинг: 3Ответов: 1Опубликовано: 23.08.2023
#include <iostream>


template <typename T, typename U>
struct is_same{
    const static bool value = false;
};

template <typename T>
struct is_same<T, T>{
    const static bool value = true;
};



template<typename T, typename U>
bool same(T, U){
    return is_same<T, U>::value;
}


int main(){

    const int x = 0;
    int y;

    std::cout << is_same<const int, int>::value << '\n'; // false 
    std::cout << same(x, y) << '\n';                     // true

}

Почему same возвращает true если типы x - const int а y - int? Что нужно сделать, что-бы same возвращал false как и is_same?

Ответы

▲ 4Принят

Вы передаете значения в функцию "по значению":

template<typename T, typename U>
bool same(T, U)

Т.е. аргументы функции, являются временными переменными, и содержат копию значений, переданных при вызову функции. При создании копии константность теряется.

Используйте передачу аргументов "по ссылке":

template<typename T, typename U>
bool same(T&, U&)

P.S. Для поддержки определения типов выражений same(1+2, 3.0+4.0) можно использовать универсальную ссылку:

template<typename T, typename U>
bool same(T&&, U&&)