Так как C++ вставляет неявное сравнение с нуля, эта линия
if (!std::getline(std::cin, cmdline)) break;
эквивалентно
if (!std::getline(std::cin, cmdline) != 0) break;
или просто
if (std::getline(std::cin, cmdline) == 0) break;
std::getline
возвращает поток, на котором он называется , Поток преобразуется в bool
или в void*
, в зависимости от версии библиотеки C++. Преобразованное значение становится равным нулю при достижении конца входа. Вот почему цикл заканчивается, когда нет дополнительного ввода для чтения.
Другой способ, чтобы написать тот же код будет выглядеть следующим образом:
std::string cmdline;
while (std::getline(std::cin, cmdline)) {
std::istringstream cmdstream(cmdline);
std::string cmd;
cmdstream >> cmd;
...
}
Это позволяет поместить конечное состояние в заголовке петли, за счет декларирования cmdline
вне цикла.
«' std :: getline' возвращает ноль, когда достигнут конец ввода ». Он фактически возвращает сам поток, где он затем преобразуется контекстом в' bool', используя его оператор булевого преобразования. 'std :: getline == 0' - ошибка времени компиляции (в> = C++ 11), в C++ 03 происходит преобразование в' void * ', которое затем сравнивается с константой нулевого указателя' 0' это действительно. – 0x499602D2
@ 0x499602D2 Спасибо за комментарий! Я не хотел вдаваться в мелкие детали здесь, но, я думаю, нет способа избежать этого. – dasblinkenlight