所以for_each的第三个参数是一个仿函数,但是我可以给它一个函数名,是否有一个隐式转换和一些临时仿函数被创建了?
例如:
void Print(int n)
{
cout << n;
}
void f(vector<int> &v)
{
for_each(v.begin(), v.end(), Print);
}
我想知道c ++编译器在内部从函数Print生成一个仿函数?
答案 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 应该解决的问题。