Подробности
[В начало]
Проблема в реализации № S0743
Краткое описание
locale(const char* std_name) может создавать локаль с неверными facet'ами.
Подробное описание
Конструктор
locale(const char* std_name)
может создавать локаль с категориями, относящимися к разным именнованным локалям. Для этого в качестве std_name можно использовать строку вида
"CAT1=name1;CAT2=name2;...;CATN=nameN"
где CAT1,...,CATN - категории (LC_TYPE, LC_COLLATE, LC_NUMERIC, ...), а name1, ..., nameN - имена локали, из которой берется категория ("C", "en_US", "ru_RU", ...).
Однако те категории, для которых в качестве имени локали, из которых они берутся, стоит "C", могут получаться неверными - например, moneypunct<char>::decimal_point() и numpunct<char<::thousands_sep() возвращают '\0', хотя в "C" локали они возвращают '.' и ',' соответственно.
В приведенном ниже примере демонстрируется случай с moneypunct<char>::decimal_point()(если локали "en_US" в системе нет, то это имя можно заменить на имя любой локали, которая присутствует в системе, кроме "C" и "POSIX").
Раздел стандарта
Linux Standard Base C++ Specification 3.2, Chapter 9. Libraries, 9.1. Interfaces for libstdcxx, который ссылается на ISO/IEC 14882: 2003 Programming languages --C++, section 22.1.1.3, p5
Пример
#include <locale> #include <iostream> using namespace std; int main() { locale loc(locale("C"), "en_US", locale::collate); cout << "Name of locale is " << loc.name() << endl; locale loc_copy(loc.name().c_str()); if(use_facet<moneypunct<char> >(loc_copy).decimal_point() == '\0') cout << "decimal_point() is '\\0'\n"; return 0; }
Компонент
libstdc++
Принято
GCC Bugzilla 38368
Статус
Иправлено в gcc-4.4.0
[В начало]