std :: istream_iterator <> с copy_n () и друзьями

Приведенный ниже фрагмент считывает три целых числа из 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, но, возможно, это заслуживает отдельного вопроса.

26
задан wilhelmtell 22 February 2011 в 04:49
поделиться