不带参数如何从for_each()调用函数

时间:2019-01-13 13:33:26

标签: c++ c++11

我用C ++ 98编写了很少的代码,但遇到一个问题,我看到一个函数从for_each()循环中被调用,并且该函数定义有一个参数,但是在调用我们时没有传递任何参数给它。

下面是代码:

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

void print_square(int i)
{
 cout << i*i << endl; // here i value should be garbage
}

int main()
{
 vector<int> v;
 // vector gets filled
 for_each(v.begin(), v.end(), print_square); //print_square is called 
 return 0;
} 

为什么编译器在这里没有给出错误?如何获取矢量值?

2 个答案:

答案 0 :(得分:1)

您对表达式 for_each(v.begin(), v.end(), print_square)

有两个误解
  1. 这不是循环。
  2. 它不包含对print_square的调用。

这仅仅是对for_each函数模板实例化的函数调用。该函数接受print_square作为参数。现在,在函数内 ,很可能会有一个循环和对print_square的调用(带有参数)。这就是为什么您看到输出的原因。

答案 1 :(得分:1)

  

为什么编译器在这里没有给出错误

因为您按预期传递了函数指针(更普遍的是可调用表达式)。

for_each()模板的扩展将使用从您指定的序列中检索到的参数调用指定的可调用表达式,基本上扩展为:

for(auto x = v.begin(); x != v.end(); ++x)
     print_square(*x);
               // ^^ Here's where the parameter is actually passed