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.
下面的代码编译失败: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 specializationctype<char>
is provided so that the member functions on typechar
can be implemented inline.