我用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;
}
为什么编译器在这里没有给出错误?如何获取矢量值?
答案 0 :(得分:1)
您对表达式 for_each(v.begin(), v.end(), print_square)
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