2016-02-19 7 views
0

У меня есть одинаковые версии усиления на два разных устройствах, но поведение отличается дляlexical_cast с отрицательным числом ведет себя по-разному на разных машинах

lexical_cast<uint>("-1") 

Документации, говорится, что он должен дать мне INT_MAX (2 дополнение при опрокидывании) но на одной машине я получаю бросок исключения, а на другой - INT_MAX.

+1

'INT_MAX'? Где в документации это сказано? – AnT

+1

@Ant, [FAQ] (http://www.boost.org/doc/libs/1_60_0/doc/html/boost_lexical_cast/frequently_asked_questions.html) рассказывает о том, что происходит при приведении строки * '' -1 " 'to' uint' (что в конечном итоге зависит от правил C для 'scanf'), но я ничего не вижу в документации о литье' -1'. На самом деле, я ничего не вижу о том, чтобы кастинг из любого нестрокового типа в другой нестроковый тип, кроме случаев, когда он предполагает, что 'numeric_cast' может предложить более разумное поведение». Итак, Wonton, пожалуйста, укажите цитату и, возможно, скажите, почему вы не используете 'numeric_cast'. –

+0

Забытые кавычки. это для преобразования строк. Извините за путаницу. – wonton

ответ

1

Очевидно, если вы посмотрите на код бустер для lexical_cast вход загружается и работает при использовании кода, как этот interpreter << arg; interpreter >> result и в >> оператора

this->setg(start, start, finish);    
std::basic_istream<CharT> stream(static_cast<Base*>(this)); 
stream.unsetf(std::ios::skipws); 

Он использует std::basic_istream такие разные версии libstdC++ заставит lexical_cast вести себя по-разному на разных машинах.

+0

. ·. ошибка документации, по крайней мере. –

+1

Я не уверен, что я последую за тобой. Как разные версии 'basic_istream' отличаются тем, что влияет на код, показанный здесь? –

+0

Я не уверен, что код больше подходит. Единственное место, где я смог найти такой код (в Boost 1.59), был в 'lexical_cast_old.hpp', и у него был комментарий:' // call-by-value резервная версия (устаревшая) ' – Ferruccio