Search code examples
c++templatesoverload-resolutionfunction-templates-overloading

Raw int pointer vs vector::iterator<int>


I was trying to understand difference between a raw pointer and an vector iterator. However, the following program trips me out. Does template function have priority over non-template function?

Expected: hello! world!
Actual: hello! hello!

#include <bits/stdc++.h>
using namespace std;

template<typename It>
void foo(It begin, It end) {
  cout << "hello! ";
}

void foo(const int* a, const int* b, size_t n=0) {
  cout << "world! ";
}

int main() {
  vector<int> A = {5,6,7,8,9};
  int B[] = {1,2,3,4,5};
      
  foo(A.begin(), A.end());
  foo(B, B+5);

  cout << endl;
}

Solution

  • In general iterators of the class template std::vector are not pointers (though in some early versions of compilers they were implemented as pointers).

    For the both calls there will be called the template function. The call of the non-template function requires conversion to const (qualification conversion).

    The non-template function would be called if the array was declared with the qualifier const like

    const int B[] = {1,2,3,4,5};
    

    On the other hand, if you will declare the vector with the qualifier const like

    const vector<int> A = {5,6,7,8,9};
    

    nevertheless the template function will be called because there will be used objects of the type std::vector<int>::const_iterator that are not pointers to constant objects.