Est-ce que STD :: Showbase et STD :: ShowPos s'excluent-ils mutuellement?
Question
Cette question est née d'une discussion que j'avais sur la bonne façon de produire une valeur numérique en utilisant l'habitude ostream & operator << (ostream &, some_type)
Pour un type numérique en C ++.
La façon dont je connais le comportement de STD :: showbase et std :: showpos dans chaque base, ils s'excluent essentiellement. C'est-à-dire: en décimal, aucune base n'est indiquée, et le «+» est ajouté sur des nombres positifs; Alors qu'en hexadécimal ou octal, la base est montrée, mais un '+' n'est pas affiché (ni un moins), car la valeur du type est imprimée comme si elle était coulée à un type non signé.
Par exemple, ce programme simple (verbeux):
#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;
}
Donne cette sortie lorsqu'elle est compilée avec GCC:
+5
05
0x5
-5
01777777777777777777773
0xfffffffffffffffb
C'est ce à quoi je m'attendais toujours, après avoir utilisé C ++ depuis de nombreuses années, mais est-ce vraiment garanti par la norme, ou est-ce juste un comportement commun? Par exemple, un compilateur C ++ conforme standard pourrait-il sortir à la place une de ces séquences?
+5
+05
+0x5
-5
01777777777777777777773
0xfffffffffffffffb
ou même:
+5
+05
+0x5
-5
-05
-0x5
Pas de solution correcte