0

C++ 标准库中有一些标准基类方面,其默认行为取决于经典的“C”语言环境 ( std::locale::classic())。如果您的程序需要特定于文化的功能,这将使切换到byname其行为取决于其构造时指定的语言环境的派生类方面(又名方面)是合理的。

例如,std::ctype提供经典的“C”字符分类:

§22.4.1.3.3

   static const mask* classic_table() noexcept;

返回: 指向大小数组的初始元素的指针,table_size它表示“C”语言环境中字符的分类

这是否意味着 的行为在std::ctype 功能上与安装它的语言环境不同?例如,假设我有一个日语语言环境:

std::locale loc("ja_JP");

我想使用一个对日文字符进行字符分类的构面。字符分类是std::ctype为了:

auto& f = std::use_facet<std::ctype<char>>(loc);

Willfctype方法是根据日语语言环境还是经典的“C”语言对字符进行分类?我的第一个猜测是基于上面标准引用的“C”语言环境,但实际上它是日语语言环境。我想知道为什么报价与这里发生的事情不一致。

以下是我的问题:

  • 为什么标准说ctype当 ctype 实际根据使用它的语言环境进行分类时执行“C”字符分类?

  • 既然上面是真的,那么派生类的切面又是从哪里来的呢?当基类已经使用我想要的语言环境时,为什么要使用派生类方面?

4

1 回答 1

1

只有默认构造的 std::ctype<char>facetclassic_table用于其分类。从系统提供的刻面"ja_JP"不是这样的例子。

在谈论派生方面时,人们通常指的是从 std::ctype 等派生的用户定义方面,而不是系统提供的byname方面。如果要重新定义某些字符类,可以使用派生ctype方面,例如,将逗号视为空格以解析逗号分隔的输入流,或停止将空格和制表符视为空格,以逐行解析流.

于 2013-07-24T01:27:24.617 回答