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

У меня одинаковые версии boost на двух разных устройствах, но поведение отличается для

lexical_cast<uint>("-1")

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


person wonton    schedule 19.02.2016    source источник
comment
INT_MAX? Где в документации это сказано?   -  person AnT    schedule 19.02.2016
comment
@Ant, часто задаваемые вопросы говорят о том, что происходит при приведении строки "-1" к uint (что в конечном итоге зависит от правил C для scanf), но я ничего не вижу в документации о приведении -1. На самом деле я ничего не вижу в приведении любого нестрокового типа к другому нестроковому типу, за исключением случаев, когда предполагается, что numeric_cast может предложить более разумное поведение. Итак, Вонтон, приведите цитату и, возможно, объясните, почему вы не используете numeric_cast.   -  person Rob Kennedy    schedule 19.02.2016
comment
Забыл цитаты. это для преобразования строк. Извините за путаницу.   -  person wonton    schedule 20.02.2016


Ответы (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 вести себя по-разному на разных машинах.

person wonton    schedule 19.02.2016
comment
.·. ошибка документации, по крайней мере. - person Lightness Races in Orbit; 19.02.2016
comment
Я не уверен, что понимаю тебя. Чем отличаются разные версии basic_istream, что влияет на приведенный здесь код? - person Rob Kennedy; 19.02.2016
comment
Я не уверен, что этот код больше актуален. Единственное место, где я смог найти подобный код (в Boost 1.59), было в lexical_cast_old.hpp и там был комментарий: // call-by-value fallback version (deprecated) - person Ferruccio; 20.02.2016
comment
Я получил этот код от boost 1_38, поэтому он, вероятно, уже не так полезен, но я потратил на это часы и часы, поэтому, если хотя бы один человек получит пользу, я буду счастлив. - person wonton; 20.02.2016