为什么 std::uppercase 不适用于字符串?

Why std::uppercase doesn't work with strings?

我使用操纵器已经有一段时间了,但还没有完全理解它们的工作原理。

此代码:

std::cout << std::hex << std::showbase;
std::cout << std::uppercase << 77 << '\n';
std::cout << std::nouppercase << 77 << '\n';

或者这个:

std::cout << std::hex;
std::cout << std::setiosflags(std::ios::showbase | std::ios::uppercase) << 77 << '\n';
std::cout << std::nouppercase << 77 << '\n';

两者都输出:

0X4D // 'X' and 'D' uppercase
0x4d // 'x' and 'd' lowercase

但是下面的none行代码可以将字符串"abcd"转换为大写。为什么?

std::cout << std::uppercase << "abcd" << '\n';
std::cout << std::setiosflags(std::ios::uppercase) << "abcd" << '\n';

另一个问题是为什么 showbaseuppercase 必须在 std::setiosflags() 内用 std::ios:: 限定,而在该函数外只能用 std:: 限定?

最后,为什么std::hex里面不能接受std::setiosflags()

谢谢

std::uppercase只影响十六进制的转换结果。

std::hex 是一个操纵器对象,而 setiosflags 需要一个通过组合各个位形成的整数。或者,更准确地说,是一种以这种方式行事的类型。您可以使用 std::ios_base::hex.

而不是 std::hex (这是错误的类型)

阅读 std::uppercase 的文档。

Enables the use of uppercase characters in floating-point and hexadecimal integer output.

std::ios_base::hexstd::setiosflags 接受 docs.

中有一个例子

这里是 std::uppercase 的例子:

#include <iostream>
int main()
{
    std::cout << std::hex << std::showbase
              << "0x2a with uppercase: " << std::uppercase << 0x2a << '\n'
              << "0x2a with nouppercase: " << std::nouppercase << 0x2a << '\n'
              << "1e-10 with uppercase: " << std::uppercase << 1e-10 << '\n'
              << "1e-10 with nouppercase: " << std::nouppercase << 1e-10 << '\n';
}

这里是 std::setiosflags 的例子:

#include <iostream>
#include <iomanip>

int main()
{
    std::cout <<  std::resetiosflags(std::ios_base::dec) 
              <<  std::setiosflags(  std::ios_base::hex
                                   | std::ios_base::uppercase
                                   | std::ios_base::showbase) << 42 << '\n';
}

定义:

std::hex 定义为 std::ios_base& hex( std::ios_base& str );

std::ios_base::hex 定义为 static constexpr fmtflags hex = /*...*/;

我想加我的 2 美分。我在代码的开头写了这两行以使生活更轻松:

const long base = std::ios::showbase;
const long upper = std::ios::uppercase;

以后用常量代替繁琐的代码。