標準では、最小の「C」ロケールに一致するようにデフォルト構築が必要です。 std::ctype<char>
§22.4.1.3.3[facet.ctype.char.statics]/1
static const mask* classic_table() noexcept;
戻り値:table_size
「C」ロケールでの文字の分類を表すサイズの配列の最初の要素へのポインター
のコンストラクターに別のテーブルが提供されない限り、分類メンバー関数is()
は、の観点からtable()
定義されます。classic_table()
ctype<char>
これらの要件により適切に一致するように cppreference を更新しました (これも「C」と表示されていstd::ctype<wchar_t>
ました) 。
2番目の質問に答えるために、で構築されたロケールは、std::locale loc(std::locale("en_US.UTF8"), new std::ctype<char>);
指定したctypeファセット(したがって「C」)を使用してナロー文字を分類しますが、冗長です:プレーン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]);
}