Общеизвестно, что cin не является типобезопасным (например, cin >> целое число, а ввод «пятьдесят пять» вызовет его переворачивание).
Тип безопасности не делаетЯ имею в виду то, что вы думаете, что это значит.«пятьдесят пять» - это строка.Безопасное преобразование его в число - сложная проблема, если вы действительно хотите иметь универсальную / переносимую реализацию (что, если это «cinquante-cinq» [французский] или «femtifem» [норвежский])?Вам придется учитывать язык, лексический анализ, грамматическую корректность и так далее.Это далеко выходит за рамки STL.
std::istream
является типобезопасным в том смысле, что если вы попробуете приведенный вами пример, поток распознает ошибку («знайте» ее)не может интерпретировать поток как целое число) и сигнализировать ваш клиентский код об ошибке таким способом, который можно проверить и обработать в клиентском коде.
Для сравнения, если вы используете int i; sscanf("fifty five", "%s", &i);
, это будетВероятно, не возникнет никакой ошибки, заполните i
мусором, и ваша программа может завершиться сбоем позже, если это зависит от i
, имеющего допустимое значение (я могу ошибаться в этом - я не использовал sscanf
сшкола или около того).Кроме того, он может повредить память вашей программы, если у вас есть запрос на форматирование, который не соответствует содержимому вашей входной строки.