Являются ли std :: showbase и std :: showpos взаимоисключающими?

Этот вопрос возник в результате обсуждения правильного способа вывода числового значения с помощью обычного ostream & operator << (ostream &, some_type) для числового типа в C ++ .

Насколько я знаю поведение std :: showbase и std :: showpos в каждой базе, они в основном исключают друг друга. То есть: в десятичной системе счисления основание не отображается, а к положительным числам добавляется «+»; тогда как в шестнадцатеричном или восьмеричном формате отображается основание, но знак «+» не отображается (и не является минусом), поскольку значение типа печатается так, как если бы оно было приведено к беззнаковому типу.

Например, эта простая (многословная) программа:

#include <iostream>

int main() {
  std::cout << std::dec << std::showpos << std::showbase << int64_t(+5) << std::endl;
  std::cout << std::oct << std::showpos << std::showbase << int64_t(+5) << std::endl;
  std::cout << std::hex << std::showpos << std::showbase << int64_t(+5) << std::endl;
  std::cout << std::dec << std::showpos << std::showbase << int64_t(-5) << std::endl;
  std::cout << std::oct << std::showpos << std::showbase << int64_t(-5) << std::endl;
  std::cout << std::hex << std::showpos << std::showbase << int64_t(-5) << std::endl;
}

Выдает следующий результат при компиляции с помощью GCC:

+5
05
0x5
-5
01777777777777777777773
0xfffffffffffffffb

Это то, что я всегда ожидал, используя C ++ в течение многих лет, но действительно ли это гарантируется стандартное, или это обычное поведение? Например, может ли компилятор C ++, соответствующий стандарту, вместо этого вывести одну из этих последовательностей?

+5
+05
+0x5
-5
01777777777777777777773
0xfffffffffffffffb

или даже:

+5
+05
+0x5
-5
-05
-0x5
5
задан wjl 7 December 2011 в 23:38
поделиться