2017-01-13 16 views
0

Что такое возвращаемое значение «stringstream >> something»? Например, возвращаемое значение «stringstream_obj >> int_obj». Я понимаю, что возвращаемый тип все еще является потоком из-за «istream & operator >> (int & val)». Но какова ценность? Чтобы быть конкретным, вот мой код.Что такое возвращаемое значение «stringstream >> something»?

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main (void) 
{ 
    stringstream sss(string("0")); 
    int num; 
    if (sss >> num) // don't understand here 
     cout << "true" << endl; 
    else 
     cout << "false" << endl; 
    //output "true"  
    return 0; 
} 

В качестве комментария, почему вывод верен? Sss содержит только 1 символ. После «sss >> num» возвращаемый «stringstream» должен иметь пустой контент, поэтому значение скобки должно быть ложным.

Оценил,

ответ

2

operator>> возвращает ссылку на поток, как вы сказали. Затем, в контексте if поток преобразуется в bool через conversion operator, который дает:

верно, если поток не имеет ошибок, иначе ложь.

Вы успешно прочитать «0», так что поток не имеет ошибок, попробуйте еще раз читает один и вы увидите поток содержит ошибки и if(sss) вычисляет false.

+0

Благодарности @GillBates. Здесь я немного смущен состоянием отказа в stringstream и его ошибкой. Поскольку содержимое sss «дренируется» с помощью «sss >> num», sss входит в состояние отказа, которое блокирует дальнейшее использование этого объекта потока. Является ли состояние сбоя считающимся ошибкой? Или как они отличаются? –

+0

@leonardo_zz - Чтение удалось извлечь номер, поэтому он не подвел. Тот факт, что он также достиг eof, может быть проверен 'sss.eof()', но сам по себе не является ошибкой. –

+0

Спасибо @ BoPersson. Я понимаю, что чтению удалось извлечь «0». Меня смущает термин «состояние отказа» строкового потока, как показано в [состоянии отказа] (http://stackoverflow.com/questions/41627448/c-why-re-input-stringstream-doesnt-work-the -поперечник-остается-The-же). Состояние сбоя запускается после того, как содержимое потока строк сливается (т. Е. Eof достигнуто.), Хотя последний символ успешно извлечен. В состоянии сбоя строковый поток больше не может быть записан. Кажется, что это состояние отказа не считается ошибкой. Я прав? Оценил –

0

В C++ в общем, когда >> используется с потоками возвращается себя

http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

В оператором случае >> что делает sss >> num возвращает sss

(я предполагаю, что вы используете с + +11, который выглядит)

И тогда ваш sss aka stringstream имеет bool operator w Хич возвращает истину, если преобразование прошло успешно

так в целом, если заявление больше похоже

if(convert sss to int and check if successful) 
// success 
else 
// fail 

Это хорошее обсуждение вы можете прочитать http://www.cplusplus.com/forum/articles/6046/

 Смежные вопросы

  • Нет связанных вопросов^_^