使用空字符串“”创建std :: locale

AMA*_*AMA 6 c++ locale std

std::locale使用空字符串进行构造以使用户首选的本地语言环境成为标准的一部分吗?如果是,您是否可以指出明确指出这一点的来源?

问题描述

文档的示例std::locale包含以下内容:

std::wcout << "User-preferred locale setting is " << std::locale("").name().c_str()
Run Code Online (Sandbox Code Playgroud)

这暗示用空字符串创建语言环境将返回用户首选的本机语言环境。快速浏览后,本文还提到:

空字符串告诉setlocale使用用户在环境中指定的语言环境。

但是,在查看有关构造函数的文档std::locale时,当提供空字符串时,没有提及特殊情况。

这是报价:

3-4)构造具有指定std_name的系统语言环境的副本(例如“ C”,“ POSIX”,“ en_US.UTF-8”或“ English_US.1251”),如果该语言环境受支持的话。操作系统。以这种方式构造的语言环境具有名称。

mel*_*ene 6

标准草案中说[locale.cons]

explicit locale(const char* std_name);
Run Code Online (Sandbox Code Playgroud)
  1. 效果: 使用标准C语言环境名称(例如)构造语言环境"POSIX"。结果语言环境实现了定义为与该名称关联的语义。

  2. 抛出: runtime_error如果参数无效或为null。

  3. 备注: 该组有效的字符串参数值的是"C"""和任何实现定义的值。

""是一个有效的构造函数参数,而参数是标准的C语言环境名称。

然后,在[c.locale]中,它显式引用标准C标头<locale.h>

引用C标准(C99)7.11.1.1/3

"C"for 的值locale指定C语言转换的最小环境;""for 的值locale指定特定于语言环境的本机环境。其他实现定义的字符串也可以作为第二个参数传递给setlocale

我认为这意味着对您的问题的回答是“是”:的名称是""指本地语言环境。

  • 请注意,即使`“”`在有效的字符串参数集中,我也看到了`std :: locale(“”))(从[plugin](https://github.com/divvun / libdivvun / issues / 28)在Mac上的LibreOffice下运行) (2认同)