Почему `std :: for_each_n` не компилируется? - PullRequest
7 голосов
/ 10 марта 2020
#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> v{ 1, 2, 3, 4 };

    std::for_each_n(v.begin(), 2, [](int n) { });
}

С g cc 9.2.1 (-std=c++17) это не скомпилируется:

error: could not convert 'std::for_each<__gnu_cxx::__normal_iterator<int*, std::vector<int> >, main()::<lambda(int)> >(__first, __first.__gnu_cxx::__normal_iterator<int*, std::vector<int> >::operator+(__n2), (__f, main()::<lambda(int)>()))' from 'main()::<lambda(int)>' to '__gnu_cxx::__normal_iterator<int*, std::vector<int> >'
3900 |  return std::for_each(__first, __first + __n2, __f);

Взгляд внутрь for_each_n говорит мне, что он вызывает

std::for_each(v.begin(), v.begin() + 2, ...)

Но, очевидно, for_each, возвращающий функциональный объект, несовместим с for_each_n, возвращающим итератор.

Как мне использовать for_each_n?

1 Ответ

6 голосов
/ 10 марта 2020

Это проблема с реализацией библиотеки.

for_each возвращает копию объекта функции, который был передан.

for_each_n возвращает итератор для первого элемента после конца диапазона, который был повторен (v.begin() + 2 в этом примере).

Эти два типа несовместимы, и for_each_n возвращает результат for_each l oop не должен компилироваться.

...