Подробности

[В начало]

Проблема в реализации № 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

[В начало]