ostream 的标准默认本地化是什么?

What is the standard default localization of ostream?

我正在使用 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”。我想知道它是否应该由实现定义,或者是否违反了标准,以防我的同事说出真相。

标准定义在 basic_stringbuf 对象的构造 basic_stream 基础对象正在使用当前全局区域设置的副本进行初始化,并且使用该区域设置的结果将一直有效,直到成员 imbue 被调用。

30.6.3.1 basic_streambuf constructors [streambuf.cons]
basic_streambuf();
1 Effects: Constructs an object of class basic_streambuf<charT, traits> and initializes:
(1.1) all its pointer member objects to null pointers,
(1.2) the getloc() member to a copy the global locale, locale(), at the time of construction.
2 Remarks: Once the getloc() member is initialized, results of calling locale member functions, and of members of facets so obtained, can safely be cached until the next time the member imbue is called.

因此,在这种情况下,只有在 oss 发生更改 之后 才创建更改全局区域设置的效果。