c++ - 原始 int 指针与 vector::iterator<int>

标签 c++ templates overload-resolution function-templates-overloading

我试图理解原始指针和 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/

相关文章:

c# - 名称相似的T类型和非T类型方法的执行顺序?

c++ - 是否可以推迟过载决议?

C++ 运算符重载参数与普通参数

c++ - Map结构也支持排序?

c++ - Linux fork/exec 到同一目录中的应用程序

java - 用于文本模板的高效 java 库?

c++ - 模板变量的显式特化

templates - 如何在 PlayFramework View 中定义 html 子模板?

c++ - 如何获取字符串的所有 1 位或相邻的 2 位数字组合

c++ - 通过QAudioOutput播放WAV文件时仅发出嗡嗡声