Почему make_move_iterator () не может работать с back_inserter ()? - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь скомпилировать простой кусок кода в соответствии со стандартом C ++ 17:

#include <algorithm>
#include <iterator>
#include <vector>

using namespace std;

int main() {
    vector<int> numbers = {6, 1, 3, 9, 1, 9, 8, 12, 1};
    vector<int> res;

    copy(begin(numbers), end(numbers), make_move_iterator(back_inserter(res)));

    return 0;
}

Я получаю сообщение об ошибке make_move_iterator(back_inserter(res)).

Начало ошибки (исключая бессмысленная (на мой взгляд) последующая информация):

In file included from C:/Users/Name/mingw/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algobase.h:67,
                 from C:/Users/Name/mingw/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/algorithm:61,
                 from C:\Users\Name\CLionProjects\coursera_cpp_course3\week5\c3_w5_t6_merge_sort_3\c3_w5_t6_merge_sort_3.cpp:2:
C:/Users/Name/mingw/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_iterator.h: In instantiation of 'class std::move_iterator<std::back_insert_iterator<std::vector<int> > >':
C:\Users\Name\CLionProjects\coursera_cpp_course3\week5\c3_w5_t6_merge_sort_3\c3_w5_t6_merge_sort_3.cpp:49:77:   required from here
C:/Users/Name/mingw/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_iterator.h:1023:24: error: forming reference to void
     __base_ref>::type  reference;
                        ^~~~~~~~~

Я прочитал документацию по make_move_iterator () и не видел никаких предварительных условий для ее использования здесь.

Почему это происходит? Спасибо за ваши предложения.

Условия, при которых я пытаюсь скомпилировать:

  • Windows 10

  • MinGW 8.1 .0

  • CMake 3.17.1

Обновление: Я понял свою ошибку. Здесь должно быть:

copy(make_move_iterator(begin(numbers)), make_move_iterator(end(numbers)), back_inserter(res));

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

std::make_move_iterator создает std::move_iterator, что предполагается для работы с InputIterator , т.е. для перемещения значений из итератора вместо копирования их.

std::move_iterator - это адаптер итератора, который ведет себя точно так же, как и базовый итератор (, который должен быть не менее LegacyInputIterator ), за исключением того, что разыменование преобразует значение, возвращаемое базовым итератором, в значение r. Если этот итератор используется в качестве входного итератора, эффект состоит в том, что значения перемещаются, а не копируются из .

1 голос
/ 21 апреля 2020

В документе, на который вы ссылались, четко сказано:

Параметры

i - итератор ввода для преобразования в итератор перемещения

std::back_insert_iterator не входной итератор , это выходной итератор . value_type из std::back_insert_iterator равно void, на что жалуется сообщение об ошибке:

, формирующее ссылку на void

...