1

C++ 参考中,find 方法定义为

template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);

但是,当我使用 find 方法时,我使用 find() 方法,而没有明确描述 InputIterator 和 T。

例如,我使用

std::vector<T> aList
...
std::list<int>::iterator pointer = std::find(aList.begin(), aList.end(), *it);

不是这个

std::list<int>::iterator pointer = std::find<std::list<int>::iterator, int>(aList.begin(), aList.end(), *it);

它是如何工作的?为什么我在使用 find 方法时不需要指定类型?

4

2 回答 2

1

因为类型是推导出来的。编译器可以查看调用,并确定由于您传递的是 value aList.begin(),因此迭代器的返回类型将是aList.begin(). 与 using 类似*it- 编译器知道什么是类型*it,因此可以推断出作为函数参数传入的类型。

于 2013-06-03T02:03:19.263 回答
1

这称为参数类型推导。来自 C++ 标准(C++11 版本):

(§14.8.2/1) 当一个函数模板特化被引用时,所有的模板参数都应该有值。这些值可以明确指定,或者在某些情况下,可以从使用中推导出来或从默认模板参数中获取。[ 例子:

void f(Array<dcomplex>& cv, Array<int>& ci) {
  sort(cv);   // calls sort(Array<dcomplex>&)
  sort(ci);   // calls sort(Array<int>&)
}

void g(double d) {
  int i = convert<int>(d);   // calls convert<int,double>(double)
  int c = convert<char>(d);  // calls convert<char,double>(double)
}

—结束示例]

类型推导仅在存在参数时进行,即它仅适用于函数模板,不适用于类模板(甚至不适用于构造函数)。

类型推导会导致非常复杂的歧义,尤其是在给出多个模板特化和/或重载函数定义时。在某些情况下,这是不可能的,然后您必须使用尖括号语法显式指定部分或全部模板参数。

于 2013-06-03T02:07:13.697 回答