stringstream не передает отрицательные значения в неподписанных типах?

У меня такая же проблема в Ubuntu 10.04 с использованием gcc4.4, тот же код отлично работает на RH 5.5 с использованием gcc4.1

#include <sstream>
#include <iostream>

int main(int argc, char** argv) {

  std::stringstream myStream;
  myStream << "-123";

  unsigned int myUInt;
  myStream >> myUInt;

  if(myStream.fail()) {
    std::cout << "FAILED" << std::endl;
  }
} 

не дает FAILED, я уже нашел это:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39802

где было указано, что это было исправлено в gcc4.1, не уверен, что поведение этого промаха (если я что-то не упустил) связано с той же проблемой.


person Gaetano Mendola    schedule 04.08.2010    source источник


Ответы (1)


Я не уверен, почему вы ожидаете, что это потерпит неудачу. sscanf() также не дает сбоя, но считывает число, а потоки C++ должны работать как функции scanf:

#include <stdio.h>

int main(int argc, char** argv) {
    unsigned int n;
    if ( ! sscanf( "-1", "%ud", & n ) ) {
        printf( "fail\n" );
    }
    else {
        printf( "%ud", n );
    }
} 

печатает 4294967295d.

И см. также неподписанное преобразование строкового потока не работает?.

person Community    schedule 04.08.2010
comment
Потому что на RH5.4 с компилятором 4.1 не работает. Также я не уверен в том, что stringstream должен вести себя как scanf. Не говоря уже о том, что boost::lexical_cast полагается на тот факт, что он должен дать сбой, действительно, я обнаружил, что строковый поток не дает сбоев из-за того, что boost::lexical_cast‹unsigned int›(-123) не выбрасывает. В конце ссылки, которую вы разместили, говорится, что она будет исправлена ​​​​для 4.4.1, но на самом деле этот код не работает с 4.4.3. - person Gaetano Mendola; 04.08.2010
comment
@kalman Да, это ошибка! Это было в 4.1, позже было исправлено. Кроме того, из другого вопроса вы можете видеть, что ведутся споры о правильном2 поведении. - person ; 04.08.2010
comment
Итак, вы имеете в виду, что тот факт, что stringstream не работает с потоковой передачей -123 в беззнаковом типе, был ошибкой, а не функцией? - person Gaetano Mendola; 04.08.2010
comment
@kalman Ожидаете ли вы, что если вы прочитаете -1 в беззнаковое целое число, оно примет значение UINT_MAX? Если это так, текущее поведение (т. е. отсутствие сбоев) является правильным. - person ; 04.08.2010
comment
Нет, я ожидаю того же поведения, что и при преобразовании XXXXXX в int. - person Gaetano Mendola; 04.08.2010
comment
Действительно мне не повезло. Во всяком случае, теперь я проверяю с помощью признаков типа, является ли целевой тип беззнаковым, а затем, прежде чем преобразовать в реальную цель, я сначала преобразую его в двойное, чтобы проверить, является ли он отрицательным, и в случае, если я бросаю bad_cast.... - person Gaetano Mendola; 04.08.2010