std::boolalpha与std::ios::boolalpha的区别及setf参数疑问
为什么setf()要用ios_base::boolalpha而不能传std::boolalpha?
其实这俩名字看起来像双胞胎,但本质完全是两种不同类型的东西,这就是核心原因:
std::boolalpha是输出操作符(manipulator):它本质上是一个函数对象,当你写
std::cout << std::boolalpha;的时候,其实是调用了ostream专门给操作符重载的operator<<,这个重载函数内部会帮你调用cout.setf(ios_base::boolalpha)来完成标志位的设置——你可以把它理解成一个“一键设置”的快捷工具,封装了底层的标志位操作。ios_base::boolalpha是格式标志位(fmtflags枚举值):而
setf()成员函数的参数要求必须是ios_base::fmtflags类型的枚举常量,这个类型是专门用来表示流的各种格式状态的二进制位掩码。ios_base::boolalpha就是这个枚举里预定义好的一个常量,用来控制布尔值是否以文字(true/false)形式输出。
举个错误示例看差异
如果强行把std::boolalpha传给setf(),比如写:
std::cout.setf(std::boolalpha);
编译器会直接报错,因为std::boolalpha的类型是std::ios_base& (*)(std::ios_base&)(一个指向操作符函数的指针),和setf()要求的ios_base::fmtflags枚举类型完全不匹配,根本没法转换。
简单总结:一个是帮你调用setf的快捷工具,一个是setf需要的原始参数,类型完全不同,自然不能混用。
内容的提问来源于stack exchange,提问作者terto
相关产品推荐
相关产品推荐

