C++ 转换_primary()并按名称整理_()

C++ 转换_primary()并按名称整理_(),c++,c++11,locale,C++,C++11,Locale,下面的程序在使用clang++/libc编译时正确地打印true,以提供我所说内容的上下文++ #include <iostream> #include <regex> int main() { std::locale::global(std::locale("en_US.UTF-8")); std::wstring str = L"AÀÁÂÃÄÅaàáâãäå"; std::wregex re(L"[[=a=]]*", std::regex::b

下面的程序在使用clang++/libc编译时正确地打印
true
,以提供我所说内容的上下文++

#include <iostream>
#include <regex>
int main()
{
    std::locale::global(std::locale("en_US.UTF-8"));
    std::wstring str = L"AÀÁÂÃÄÅaàáâãäå";
    std::wregex re(L"[[=a=]]*", std::regex::basic);
    std::cout << std::boolalpha << std::regex_match(str, re) << '\n';
}
#包括
#包括
int main()
{
std::locale::global(std::locale(“en_US.UTF-8”);
std::wstring str=L“AÀAÁAÄAåAå”;
std::wregex re(L“[[=a=]]*”,std::regex::basic);
std::cout“我的问题是,标准中的typeid比较应该如何确保这一点?这是否意味着从区域设置中拉出的所有系统提供的facet都将_byname作为其真正的动态类型?”

为了回答问题的前半部分,typeid比较确保了这一点,因为如果用户使用不同的值为
use\u facet
实例化了模板,typeid比较将失败。如果typeid确实匹配,则将确保要调度的函数不会被用户覆盖。因此,y您将获得系统collate_byname类,并将调用适当的转换

为了回答问题的第二部分,它只意味着所有系统提供的与regex预期使用的地区相关联的方面都符合这个实现要求

还请注意,没有可移植的方法来实现transform_primary 就std::locale而言,因为即使 std::collate_byname::transform是已知的,可以转换为 主排序键,用户仍可以安装自己的自定义 将实现整理到所使用的区域设置对象中,这样可以 使用他们认为合适的任何排序键格式 因此,函数更多地用于自定义traits类,并且应该 如果无法为特定的应用程序实现异常,则引发异常 地点


简言之,这告诉我们,如果存在预期之外的任何东西(即提供的系统)对于该类型/typeid的值,结果可能不可预测,因为用户可以提供不同的排序键格式。通过坚持使用系统提供的值,该方面的typeid将是已知的,因此排序键将是已知的和可预测的。

现在,我将使用分辨率更新答案。

您执行的代码rm使用VC++2010编译ok,即使以非Unicode的方式返回
false
。是否正确?@sublay它也使用gcc返回false,因为它还没有实现此功能。我附近没有VC来检查它们做了什么。但不管每个编译器中POSIX BRE的完整性状态如何,我的主要问题是这是否正确标准中的d-to-read行实际上暗示了我认为它暗示的所有方面的动态类型。或者它只是像下一条(LWG 2018)中的措辞一样糟糕。在我看来,这一实现要求(动态类型平等)与基本原理不符(禁止用户安装校对方面),因为
collate_byname
仅被定义为“等同于”系统方面(§22.3.1.1.2/4)。当然,这不是唯一一次标准库对区域设置方面施加限制,这种特殊的限制似乎是任意的。