При копировании состояния формата ввода, обнаружил, что по умолчанию оно не нулевое. Решил провести тест: обнулить и смотреть что получается:
//обнуление всех флагов с сохранением старых
auto old_flags = cout.flags(0);
std::cout << "number of old flags cin/cout: "
<< std::bitset<12>(old_flags).count()
<< "\nnumber of new flags: " << cout.flags();
//восстановление старых флагов
cout.setf(old_flags);
Полученный результат говорит о том, что по умолчанию были установлены два формата, но после обнуления поток работает с таким же успехом.
P.S. Последный вывод выдает ноль. Это подтверждение того, что ни один формат не установлен.
Вопрос: Какие же форматы установлены по умолчанию и как они влияют на состояние потока?
int main(int argc, const char * argv[])
{
auto old_flags = cout.flags(0);
#define fmt(x) cout << #x << ": " << (ios_base::x & old_flags) << endl
fmt(dec);
fmt(oct);
fmt(hex);
fmt(left);
fmt(right);
fmt(internal);
fmt(scientific);
fmt(fixed);
fmt(floatfield);
fmt(boolalpha);
fmt(showbase);
fmt(showpoint);
fmt(showpos);
fmt(skipws);
fmt(unitbuf);
fmt(uppercase);
}
Для Visual C++ 2017 дает ненулевые dec и skipws.
Для gcc, впрочем, то же самое: https://ideone.com/amWkcN
Сборка персонального компьютера от Artline: умный выбор для современных пользователей