2015-02-13 28 views
6

użyłem stwierdzenia takie jak to całkiem sporo w moim C++ Programowanie:Dlaczego działa (std :: ifstream >> s)?

std::string s; 
std::ifstream in("my_input.txt"); 
if(!in) { 
    std::cerr << "File not opened" << std::endl; 
    exit(1); 
} 
while(in >> s) { 
    // Do something with s 
} 

Co chcę wiedzieć, dlaczego to działa?

Spojrzałem na wartość zwracaną przez operator>>, a jest to obiekt istream, a nie boolowski. W jaki sposób obiekt istream jest w jakiś sposób interpretowany jako wartość bool, którą można umieścić w instrukcjach if i pętlach?

+1

Nie musi to być * bool' musi mieć * niejawną konwersję * na 'bool'. Na przykład dowolne z poniższych to "falsy": '0',' nullptr', '0x0',' false', itp. – CoryKramer

+0

Hmm, widzę. Jak określić, które klasy mają niejawną konwersję na wartość bool? – bobroxsox

+1

Jak wspomniano o @JosephMansfield, klasa musi mieć zdefiniowane 'operator bool()'. – CoryKramer

Odpowiedz

6

Klasa podstawowa std::basic_ios udostępnia metodę operator bool(), która zwraca wartość logiczną reprezentującą ważność strumienia. Na przykład, jeśli odczyt osiągnie koniec pliku bez przechwytywania żadnych znaków, to w strumieniu zostanie ustawione std::ios_base::failbit. Następnie zostanie wywołany operator bool(), zwracając !fail(), w którym to czasie ekstrakcja zostanie zatrzymana, ponieważ warunek jest fałszywy.

Wyrażenie warunkowe stanowi wyraźne logiczny konwersji więc:

while (in >> s) 

odpowiada tej

while (static_cast<bool>(in >> s)) 

co jest równoznaczne z tym

while ((in >> s).operator bool()) 

co jest równoważne

while (!(in >> s).fail()) 
+1

Oczywiście w wersji przed C + +11, to nie było 'operator bool', ale' operator void * '. Ale efekt był taki sam, ponieważ 'void *' zamienia pośrednio na 'bool'. –

5

std::basic_ios, z których strumienie wejściowe i wyjściowe dziedziczyć, posiada funkcję konwersji operator bool (lub operator void* przed C++ 11, aby ominąć safe-bool problem, która nie jest już problemem dzięki hasła explicit).

3

Patrz std::basic_ios::operator bool:

Operator umożliwia użycie strumieni i funkcji, które zwracają odnośniki strumieni w warunkach pętli, w wyniku wejścia w idiomatycznej C++, takie jak pętle lub while(stream >> value) {...}while(getline(stream, string)){...}. Takie pętle wykonują ciało pętli tylko wtedy, gdy operacja wejścia powiodła się.

Powiązane problemy