gpt4 book ai didi

c++ - std::ctype 是否总是按 "C"语言环境对字符进行分类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:07 26 4
gpt4 key购买 nike

cppreference 表示 std::ctype 提供基于经典“C”语言环境的字符分类。当我们创建这样的语言环境时,这甚至是真的吗:

std::locale loc(std::locale("en_US.UTF8"), new std::ctype<char>);

loc 的方面是否仍会根据“C”语言环境或 Unicode 语言环境对字符进行分类?如果按前者分类,为什么我们还要将语言环境名称指定为“en_US.UTF8”?

最佳答案

标准要求默认构造 std::ctype<char>通过 §22.4.1.3.3[facet.ctype.char.statics]/1 匹配最小的“C”语言环境

static const mask* classic_table() noexcept;

Returns: A pointer to the initial element of an array of size table_size which represents the classifications of characters in the "C" locale

分类成员函数is()根据 table() 定义这是根据 classic_table() 定义的除非向 ctype<char> 提供了另一个表的构造函数

我更新了 cppreference 以更恰本地匹配这些要求(它也为 std::ctype<wchar_t> 说“C”)

要回答您的第二个问题,用 std::locale loc(std::locale("en_US.UTF8"), new std::ctype<char>); 构建的语言环境将使用您指定的 ctype 方面(因此,“C”)对窄字符进行分类,但这是多余的:narrow character classification of a plain std::locale("en_US.UTF8") (至少在 GNU 实现中)是完全一样的:

#include <iostream>
#include <cassert>
#include <locale>
int main()
{

std::locale loc1("en_US.UTF8");
const std::ctype_base::mask* tbl1 =
std::use_facet<std::ctype<char>>(loc1).table();

std::locale loc2(std::locale("en_US.UTF8"), new std::ctype<char>);
const std::ctype_base::mask* tbl2 =
std::use_facet<std::ctype<char>>(loc2).table();

for(size_t n = 0; n < 256; ++n)
assert(tbl1[n] == tbl2[n]);
}

关于c++ - std::ctype 是否总是按 "C"语言环境对字符进行分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17681882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com