std::cout.imbue()多重调用

std::cout.imbue() multiple call

本文关键字:调用 cout imbue std      更新时间:2023-10-16

编译器:Visual Studio 2019(C++20,最新版本(
我有一个关于std::locale的问题
是否无法调用std::cout.imbue multiple
为什么不可能

当我在代码以下运行时。。我可以在第二次调用函数后看到两个问号(??(。。

#include <iomanip>
#include <iostream>
#include <locale>
int main()
{
auto loc = std::locale("de_DE.utf8");
std::cout.imbue(loc);
std::cout << "locale_name = " << std::cout.getloc().name() << std::endl;
std::cout << 100.50 << std::endl;
std::cout << std::showbase << std::put_money(1050) << std::endl;
std::cout.imbue(loc);   // no output below
std::cout << "locale_name = " << std::cout.getloc().name() << std::endl;
std::cout << 100.50 << std::endl;
std::cout << std::showbase << std::put_money(1050) << std::endl;
}

这是输出
locale_name=de_de.utf8
10,5
10,10??

没有这样的限制,我的输出是:

locale_name = de_DE.utf8
100,5
10,50 €
locale_name = de_DE.utf8
100,5
10,50 €

请注意,如果您的输出终端没有正确配置为显示UTF-8字符,或者您的终端字体中缺少该字形,则欧元符号可能会被??等奇怪的东西所取代。

例如,在内存中,VisualStudio的输出控制台要么不支持Unicode,要么总是解码为UTF-16。二者之一。可能是后者。

除此之外,如果您得到的输出与上面的不同,那么在您的实现中,这将是一个有趣的标准库错误。