Короче говоря:
Это означает, что вы можете использовать getline()
в операторе if
, и если он работает, вы вводите блок оператора if
.
In Long:
getline()
, используемый в логическом контексте, возвращает неявное преобразование в void*
.
Вышеуказанное не является технически правильным (но это результат).getline()
фактически возвращает ссылку на поток, в котором он использовался.Когда поток используется в логическом контексте, он преобразуется в неопределенный тип (C ++ 03), который может использоваться в логическом контексте.В C ++ 11 это было обновлено и преобразовано в bool
.
- . Если
getline()
успешно, он возвращает поток в хорошем состоянии.Когда он преобразуется в тип bool
типа , он возвращает ненулевой указатель (C ++ 03), который при использовании в логическом контексте эквивалентен true
. - Если
getline()
завершается неудачно, он возвращает поток в плохом состоянии.Когда он преобразуется в тип bool
типа , он возвращает нулевой указатель (C ++ 03), который при использовании в логическом контексте эквивалентен false
.
Я не нашел нигде в Интернете никакой реальной ссылки на это утверждение.
- 21.4.8.9 Вставки и экстракторы [string.io]
- Определяет: std :: istream & getline (std :: istream &, std :: string &)
- 27.7.2.1 Шаблон класса basic_istream [istream]
- Определяет: std :: istream & getline (char_type * s, размер потока n);
- 27.5.5.1 Обзор [ios.overview]
- Определяет, как поток преобразуется в логическом контексте
Везде говорится, что неявного преобразования не существует и что в указателях логического контекстадолжен быть того же типа (и если ptr == 0
, чем 0
преобразуется в тип указателя ptr
).
Нулевой void*
в логическом контексте равен eqв false
, любой другой void*
эквивалентен true
.(хотя тип на самом деле не указан, но вы можете думать о нем как о void*
(просто, чтобы об этом было легко думать).
Также в стандарте говорится, что в логическом контексте он преобразуетсяк неопределенному логическому типу. Что это вообще значит?
Это означает, что вы можете использовать любые условные операторы:
if (getline())
{
// If getline worked processes data
}
while(getline())
{
// getline. If it works then processes then try again.
}