Являются ли ошибки чтения потока строк недетерминированными? - PullRequest
0 голосов
/ 24 апреля 2018

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

std::string strVal = "11";
std::stringstream stream( strVal );  
auto value = false;

if( !( stream >> std::noboolalpha >> value ) )
{
    // report error - this path is taken on both compilers
}

// "value" is "false" here on in VS 2017, but "true" on GCC 4.6

Ожидается ли разница в поведении или это ошибка в GCC?

В соответствии с cppprefence :

Если извлечение не удалось (например, если была введена буква, где ожидается цифра), значение остается неизменным и устанавливается бит бит.

Однако value изменяется на true в GCC 4.6.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Ошибка MSVC. [Facet.num.get.virtuals] / 6:

Эффекты: Если (str.flags()&ios_­base​::​boolalpha) == 0, то введите происходит как и для long за исключением того, что если значение сохраняется в val, значение определяется в соответствии со следующим: значение, которое должно быть сохранено, равно 0, тогда false сохраняется. Если значение 1, то true сохраняется. В противном случае true сохраняется, а ios_­base​::​failbit назначен на err.

0 голосов
/ 24 апреля 2018

Работает с VC 19 (он же VS2015) , ваш пример кода показывает value это false.

При GCC 8 вернуться к 4.4.7 с любым флагом -std=, оно всегда показывало, что value было изменено на true.

В C ++ 11 предполагается установить значение true, но в предыдущих стандартах предполагалось оставить его без изменений, что в T.C. Примечания был дефект в самом стандарте. Таким образом, MSVC является несовместимым в C ++ 11, а GCC был несовместимым в соответствии с более ранними стандартами, но теперь соответствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...