std::ctype 派生 Class 无法为 char 编译

std::ctype Derived Class Fails to Compile for char

下面的代码编译失败:override did not override any base class methods & do_is is not a member of ctype

它适用于 wchar_t

测试于 VC++ 2022,默认设置。 [编辑] 我得到了在线 GCC 的相同结果。看起来这是一个功能,但为什么呢?

#include <locale>

struct fail_t : std::ctype<char> // works for wchar_t
{
  bool do_is(mask m, char_type c) const override
  {
    return ctype::do_is(m, c);
  }
};

int main()
{
  // nop
}

也许不是完整答案,但cppreference site page for the std::ctype<char> specialization1 简要 ] 解释(加粗我的):

This specialization of std::ctype encapsulates character classification features for type char. Unlike general-purpose std::ctype, which uses virtual functions, this specialization uses table lookup to classify characters (which is generally faster).

另请注意,在该页面上,没有 do_is() 成员函数(继承或其他方式)。

至于你问题的“但是为什么”部分:我想最后一个(带括号的)短语涵盖了:通常更快


1 我很欣赏 cppreference 代表任何官方 C++ 标准;但是,它通常非常可靠,并且使用的语言通常比那些标准文档中的语言更容易理解。


查看 this C++17 Draft Standard,“但是为什么”问题还有另一个可能的答案:

25.4.1.3 ctype specializations [facet.ctype.special]

1     A specialization ctype<char> is provided so that the member functions on type char can be implemented inline.