是否存在对for_each的仿函数的隐式转换?

时间:2014-01-28 06:06:16

标签: c++

所以for_each的第三个参数是一个仿函数,但是我可以给它一个函数名,是否有一个隐式转换和一些临时仿函数被创建了?

例如:

void Print(int n)
{
  cout << n;
}

void f(vector<int> &v)
{
   for_each(v.begin(), v.end(), Print);
}

我想知道c ++编译器在内部从函数Print生成一个仿函数?

2 个答案:

答案 0 :(得分:0)

for_each的函数参数可以是函数指针或函数对象。该函数必须接受范围中的元素作为参数。

在您的情况下,Print只是一个函数指针。

答案 1 :(得分:0)

std::for_each的原型是

template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f);

(C ++ 11标准,25.2.4 [alg.foreach])

因此,如果您传递某种带有重载operator()的对象作为第三个参数,那么f将成为该对象的副本;如果你传递Print,则f成为函数Print的指针(因为传递参数执行函数指针转换)。但是在传递参数时,函数指针不会“转换”为另一个仿函数类型。

for_each 的实现可能选择将f包装在某个内部仿函数类型中。该标准未指定该功能的工作方式。我不明白为什么它会这样做。实际上,我的g ++ - 4.7头文件的实现基本上是

for (; first != last; ++first)
    f(*first);
return move(f);

无需将f存储在仿函数对象中;它只是直接调用它。在编译时,编译器将确定f的类型,因此f(*first)应该是什么意思。

请注意,声明并不会阻止您将int 1作为参数f传递,但行f(*first);没有意义,你会收到编译错误。这是 concepts 应该解决的问题。