Подробности

[В начало]

Проблема в реализации № S0781

Краткое описание

locale(const char* std_name) может создавать неверные фасеты для неоднородной локали

Подробное описание

Конструктор locale(const char* std_name), будучи вызванным для имени неоднородной локали (вида "LC_CTYPE=...;LC_COLLATE=...;...") может создать локаль, у которой содержание некоторых фасетов неверно. Неверно в том смысле, что содержимое будет отличатся от содержимого фасетов локали, созданной через конструктор locale(const locale& other, const char* std_name, category) c последовательной заменой категорий. Хотя эта локаль будет иметь имя, совпадающее с аргументом конструктора locale(const char* std_name).

Это противоречит описанию функции-члена name() (22.1.1.3, p5):
If *this has a name, then locale(name().c_str()) is equivalent to *this.

Приведенный ниже пример демонстрирует нарушение этого требования на свойстве curr_symbol() фасета moneypunct<wchar_t>.

Раздел стандарта

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

Пример

#include <locale>
#include <iostream>

using namespace std;
int main()
{
    locale loc(locale("C"), "en_GB.utf8", locale::monetary);
    const moneypunct<wchar_t>& mp
        = use_facet<moneypunct<wchar_t> >(loc);
    wcout << "curr_symbol is '"
        << mp.curr_symbol() << "'\n";

    locale loc_copy(loc.name().c_str());
    const moneypunct<wchar_t>& mp_copy
        = use_facet<moneypunct<wchar_t> >(loc_copy);
    wcout << "curr_symbol in copy is '"
        << mp_copy.curr_symbol() << "'\n";
    
    if(mp.curr_symbol() != mp_copy.curr_symbol())
        wcout << "Copy is differ from original locale.\n";
    
    return 0;
}

Компонент

libstdc++

Принято

GCC Bugzilla 40184

Статус

Иправлено в CVS

[В начало]