#include <vector>
#include <iostream>
#include <range/v3/all.hpp>
int main()
{
auto coll = std::vector{ 1, 2, 3 };
ranges::copy(
coll,
ranges::ostream_iterator<int>{ std::cout, ", " }
); // ok
ranges::copy(
coll,
std::ostream_iterator<int>{ std::cout, ", " }
); // error
}
Проблема показана в приведенном выше коде. Я использую range-v3-0.3.7.
Для меня общий алгоритм copy
не должен заботиться о типе итератора назначения, если он соответствует требованиям итератора вывода.
Если да, то почему алгоритмы диапазонов несовместимы с итераторами std?
std::ostream_iterator
разработан без какой-либо поддержки диапазонов. Дело в том, чтобы продемонстрировать возможность формального введения такой поддержки в будущий стандарт, а не ограничивать полную спецификацию. Предположительно, если диапазоны будут введены в будущую версию стандарта, спецификация дляranges::ostream_iterator
станет частью спецификации дляstd::ostream_iterator
, иranges::copy()
станет частью спецификацииstd::copy()
, и любые несовместимости будут устранены. - person Peter   schedule 21.09.2018ranges::copy
требует, чтобы его итератор вывода был конструктивным по умолчанию. Иranges::copy
останетсяranges::copy
(std::ranges::copy
, если быть точным) и не будет объединен сstd::copy
. См. Ответ Барри ниже. - person Eric Niebler   schedule 21.09.2018ranges::copy
создавать итератор вывода по умолчанию? (Почему?) Если нет, то это кажется ненужной несовместимостью ... - person Nemo   schedule 27.06.2019std::ostream_iterator
является конструктивным по умолчанию, что означает из обсуждений, что он будет работать. - person alfC   schedule 07.06.2021