Getline в если заявление - PullRequest
       8

Getline в если заявление

4 голосов
/ 20 ноября 2011

Из того, что я прочитал, getline(), используемый в логическом контексте, возвращает неявно преобразование в void*. Я не нашел нигде в Интернете никакой реальной ссылки на это утверждение. Везде говорится, что неявного преобразования не существует и что в логическом контексте указатели должны быть одного типа (и если ptr == 0, то 0 преобразуется в тип указателя ptr).

Также в стандарте говорится, что в логическом контексте он преобразуется в неопределенный логический тип. Что это вообще значит?

Ответы [ 2 ]

5 голосов
/ 20 ноября 2011

Короче говоря:

Это означает, что вы можете использовать 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.
}
0 голосов
/ 20 ноября 2011

Это не говорит об этом явно нигде в Интернете, потому что это включает в себя объединение трех разных фактов.

  1. getline() возврат istream&
  2. istream конвертируется в void*
  3. Это преобразование используется, когда istream используется в логическом контексте (например, оператор if или while).
...