Рассмотрим следующее:
template <class T> void Foo(const T* x) {
std::cout << "I am the pointer overload" << std::endl;
}
template <class T> void Foo(const T& x) {
std::cout << "I am the reference overload" << std::endl;
}
Учитывая вышеизложенное, я ожидаю, что следующее вызовет перегрузку указателя:
int* x;
Foo(x);
но это не так. Мне кажется странным, что const T*
может четко связываться с неконстантным T
так же, как и с const T&
, но вариант указателя кажется "лучше подходит".
Для моего приложения я хочу, чтобы был вызывается вариант указателя. Я могу выполнить эту работу с помощью дополнительной специализации:
template <class T> void Foo(T* x) {
const T* const_x = x;
Foo(const_x);
}
но это кажется неправильным и ненужным. Есть ли способ лучше? Что я не понимаю (кроме раздела x.y.z стандарта говорит это так)?