Это работает из-за двух свойств объектов istream:
- istreams возвращаются после каждого извлечения (оператор
>>
), чтобы разрешить цепочку множественных извлечений (a >> b >> c
)
- istreams возвращают свой статус (как если бы
.good()
вызывали), когда они приводятся / преобразуются в bool, через перегрузку bool operator !()
В основном написанный вами код является сокращенной версией:
if ( ((((ibuf >> zork) >> ia) >> Comma) >> ib).good() ) {
}
После того, как все извлечения произошли, у вас остается if (ibuf)
, что неявно похоже на запись if ((bool)ibuf)
, который проверяет ibuf.good()
.
Невозможно получить количество символов, извлеченных за серию цепочек извлечений, но вы можете найти количество символов, извлеченных во время последней операции, с помощью функции gcount . Однако он работает только для определенных функций игнорирования формата, таких как get
и getline
, но не для оператора извлечения.