Как вызывается функция из for_each () без аргумента - PullRequest
0 голосов
/ 13 января 2019

Я сделал немного кода на 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 голосов
/ 13 января 2019

почему компилятор не выдает ошибку здесь

Поскольку вы передаете указатель на функцию, как задумано (более общее вызываемое выражение ).

Расширение шаблона for_each() вызовет указанное вызываемое выражение с аргументом, полученным из указанной вами последовательности, в основном, которое расширяется до:

for(auto x = v.begin(); x != v.end(); ++x)
     print_square(*x);
               // ^^ Here's where the parameter is actually passed
0 голосов
/ 13 января 2019

У вас есть два неправильных представления о выражении for_each(v.begin(), v.end(), print_square)

  1. Это не петля.
  2. Не содержит звонка на print_square.

Это просто вызов функции для создания экземпляра шаблона функции for_each. Эта функция принимает print_square в качестве аргумента. Теперь, внутри функции , очень вероятно, что будет цикл и вызов print_square (с аргументами). Вот почему вы видите вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...