Приведенный ниже фрагмент считывает три целых числа из std :: cin
; он записывает два в числа
и отбрасывает третье:
std::vector numbers(2);
copy_n(std::istream_iterator(std::cin), 2, numbers.begin());
Я ожидал, что код будет читать ровно два целых числа из std :: cin
, но оказывается, что это правильное, соответствующее стандартам поведение. недосмотр в стандарте? Чем объясняется такое поведение?
Из 24.5.1 / 1 в стандарте C ++ 03:
После того, как он построен, и каждый time ++, итератор читает и сохраняет значение
T
.
Таким образом, в приведенном выше коде в момент вызова итератор потока уже считывает одно целое число. С этого момента каждое чтение итератором в алгоритме является упреждающим чтением, что дает значение, кэшированное из предыдущего чтения.
Последний проект следующего стандарта, n3225 , не кажется вносить любые изменения здесь (24.6.1 / 1).
В соответствующем примечании 24.5.1.1/2 текущего стандарта в отношении istream_iterator (istream_type & s)
конструктора читает
Эффекты: инициализирует
in_stream
сс
.значение
может быть инициализировано во время строительство или в первый раз
С акцентом на « значение
может быть инициализировано ...» в отличие от « должно быть инициализировано». Это звучит противоречиво с 24.5.1 / 1, но, возможно, это заслуживает отдельного вопроса.