std :: ostream忽略底层via setf()上设置的十六进制标志

时间:2018-02-05 16:25:00

标签: c++ g++ iostream iomanip

以下C ++代码令人惊讶地产生十进制输出,显然忽略了对setf()的调用和打印true 42。使用std::setiosflags()给出相同的结果。但是,使用std::cout << std::hex确实会产生预期的输出true 0x2a,因此std::ios::showbasestd::ios::boolalpha会受到尊重。

我在UOSntu上测试了G ++ 5.4,在CentOS上测试了G ++ 7.2.1。我在这里缺少什么?

#include <sstream>
#include <iostream>
#include <iomanip> 
#include <iterator>

int main()
{

    std::cout.setf(std::ios::hex | std::ios::showbase | std::ios::boolalpha);
    // Uncommenting the line below doesn't make a difference.
    //std::cout << std::setiosflags(std::ios::hex | std::ios::showbase | std::ios::boolalpha);
    // Uncommenting this line does give the desired hex output.
    //std::cout << std::hex;

    int m = 42;
    std::cout << true << ' ' << m << std::endl;
    return 0;
}

1 个答案:

答案 0 :(得分:1)

setf只有的变体添加标志,但您需要清除基本字段。

所以你需要使用带掩码的重载:

    std::cout.setf(std::ios::hex | std::ios::showbase | std::ios::boolalpha,
                   std::ios_base::basefield | std::ios::showbase | std::ios::boolalpha);

输出:

  

true 0x2a

Live Demo