【问题标题】:What is the standard default localization of ostream?ostream 的标准默认本地化是什么?
【发布时间】:2020-03-05 11:00:05
【问题描述】:

我使用的是 CLang 8.0 并给出了这个代码示例:

#include <locale>
#include <sstream>
#include <iostream>

struct slash : std::numpunct<char> {
    char do_decimal_point()   const { return '/'; }  // separate with slash
};

int main()
{
    std::ostringstream oss;

    auto slash_locale = std::locale(std::cout.getloc(), new slash);
    std::locale::global( slash_locale );

    oss << 4.5;
    std::cout << oss.str();
}

我得到的是“4.5”。我的问题是:这种忽略标准中写的语言环境的行为吗?因为我的一位同事正在使用 XCode 并声明正在打印“4/5”。我想了解它是否应该由实现定义,或者如果我的同事陈述真相,是否违反了标准。

【问题讨论】:

    标签: c++ localization c++-standard-library


    【解决方案1】:

    标准定义在构造过程中basic_stringbuf 对象的basic_stream 基对象将使用当前全局语言环境的副本进行初始化,并且使用该语言环境的结果将一直有效,直到成员imbue 被调用。

    30.6.3.1 basic_streambuf 构造函数 [streambuf.cons]
    basic_streambuf();
    1 效果:构造类basic_streambuf&lt;charT, traits&gt;的对象并初始化:
    (1.1) 其所有指针成员对象为空指针,
    (1.2) getloc() 成员在构建时复制全局语言环境 locale()
    2 备注:一旦getloc() 成员被初始化,调用locale 成员函数的结果,以及如此获得的构面成员的结果,可以安全地缓存,直到下一次调用成员imbue。

    因此,在这种情况下,仅当 oss 在发生更改之后创建时,全局语言环境更改的效果才应该可见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 2023-01-05
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多