Вы правы "Набор допустимых значений строковых аргументов -" C "," "и любые значения, определенные реализацией ..." Но если вы попытаетесь установить неизвестный локальныйможет быть возвращен локальным ("")), он выдаст ошибку во время выполнения.
Взгляните на исходный код функции libstdc++-v3/config/locale/gnu/c_locale.cc
locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, __c_locale __old)
{
__cloc = __newlocale(1 << LC_ALL, __s, __old);
if (!__cloc)
{
// This named locale is not supported by the underlying OS.
__throw_runtime_error(__N("locale::facet::_S_create_c_locale name not valid"));
}
}
__newlocale
это тот, кто виноват. это функция C, которая будет обрабатывать преобразование переданных ей значений.
в MAC-OS кажется, что libstdc++
неправильно обрабатывает значение "" и даже создает множество проблем с большим количеством локалей.
Это хорошо известная проблема в libstdc ++ (который используется g ++). Вы можете легко найти его в нескольких местах: отчет об ошибке 1 , отчет об ошибке 2 , пример 1 . Как вы можете видеть в настоящее время libstdc ++ поддерживает только локали "C".
Я говорю, используйте ICU:)