我试图理解原始指针和 vector 迭代器之间的区别。然而,下面的程序让我失望了。模板函数是否优先于非模板函数?
预期:你好!世界!
实际:你好!你好!
#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;
}
最佳答案
类模板的通用迭代器std::vector
不是指针(尽管在某些早期版本的编译器中它们被实现为指针)。
对于这两个调用,都将调用模板函数。非模板函数的调用需要转换为const(限定转换)。
如果数组是用限定符 const 声明的,则将调用非模板函数,例如
const int B[] = {1,2,3,4,5};
另一方面,如果您将使用限定符 const 声明 vector ,例如
const vector<int> A = {5,6,7,8,9};
然而,模板函数将被调用,因为将使用 std::vector<int>::const_iterator
类型的对象不是指向常量对象的指针。
关于c++ - 原始 int 指针与 vector::iterator<int>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73050100/