2016-02-06 2 views
1

Относительно /OutputIterator -s совместимо ли изменять их семантику только для перемещения? Конечно, я имею в виду только недавно созданные пользовательские итераторы, а не STL.Итераторы ввода и вывода только для перемещения

Примечание к семантическим требованиям к ++i и ++r выражению для входных и выходных итераторов соответственно говорит:

Постусловие: Любые копии предыдущего значения i больше не требуется, чтобы быть разыменовываемыми или быть в домен ==.

После этой операции r не требуется увеличивать и любые копии предыдущего значения r больше не требуются, чтобы быть разборчивыми или увеличивающимися.

Я думаю, что в большинстве случаев запрещается копировать итераторы ввода/вывода, но никогда не слышал таких советов. Это плохая идея?

+3

Если бы у меня была машинка времени, чтобы эти итераторы перемещались только в C++ 98, она была бы в верхней части моего списка. Создание собственных итераторов ввода-вывода - это безопасный эксперимент. Если вы попытаетесь использовать их с кодом, который пытается их скопировать, вы будете уведомлены во время компиляции, и вы сможете проверить эту ситуацию. Это может даже указать на ошибку в этом общем коде. –

ответ

2

ввод/OutputIterators должен сначала удовлетворить требование итератора. И это требование сказать, от C++ 14, [iterator.iterators], p2:

A Тип X удовлетворяет требования Iterator если:

  • X удовлетворяет, CopyAssignable и требования, предъявляемые к CopyConstructibleDestructible (17.6.3.1)

Так нет, они не могут быть двигаться только.

+1

Теперь я понимаю это, но я чувствую, что они должны быть только для перемещения (например, 'std :: istream'). Говард Хиннант подтверждает мои соображения. – Orient

+1

@Orient: Согласен ли я или нет, ваш вопрос был «можно ли это сделать»? Ответ «не соответствует стандарту». Диапазоны TS аналогичным образом требуют их копирования. –

+0

Я полностью согласен. – Orient

0

Это, вероятно, не очень хорошая идея. Объекты итератора обычно имеют легкий вес и передаются по значению, чтобы быть эффективными. И многие стандартные библиотеки библиотеки C++ используют итераторы, переданные по значению. Отключение конструкторов копий для меня не кажется хорошей идеей.

Например, см. http://www.cplusplus.com/reference/vector/vector/vector/ векторный конструктор принимает входной итератор по значению.

И видит http://www.cplusplus.com/reference/algorithm/copy/ для примера ++ стандартной библиотеки C контейнера, который принимает выходной итератор по значению

+0

Это не проблема: я могу передать значение итератора, используя 'std :: move'. – Orient

+0

Это будет передача итератора rvalue. Почему вы хотите это сделать? – Curious

+0

И это все равно будет связано с этим. Зачем переместить итератор в другое место, когда он более эффективен и требует меньше кода для копирования? – Curious