Consider the following:
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;
}
Given the above, I would expect the following to call the pointer overload:
int* x;
Foo(x);
but it doesn't. That seems odd to me as a const T* can clearly bind to a non-const T just as well as a const T& can but the pointer variant seems like a "better fit".
For my application I want the pointer variant to be called. I can make that work via an additional specialization:
template <class T> void Foo(T* x) {
  const T* const_x = x;
  Foo(const_x);
}
but that feels wrong and unnecessary. Is there a better way? What am I not understanding (other than section x.y.z of the standard says it's this way)?
Aucun commentaire:
Enregistrer un commentaire