Подробности

[В начало]

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

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

messages::do_get всегда возвращает пустую строку

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

Из описания функции messages<>::do_get (22.2.7.1.2):

string_type do_get(catalog cat, int set, int msgid, const string_type& dfault) const

Returns: A message identified by arguments set, msgid, and dfault, according to an implementation-defined mapping. If no such message can be found, returns dfault.


В системных (не libstdc++) локалях, как правило, нет отдельной категории, которая соответствовала бы messages facet в libstdc++. Реализация функций этого facet'а может быть практически любой, в том числе простой заглушкой. В данной реализации с помощью функции do_open() может быть открыт каталог с любым именем, и при чтении из этого каталога сообщения с любыми идентификаторами возвращается пустая строка.
Получается, что такой каталог отображает все возможные сообщения в пустые строки, что выглядит не очень логичным.

По-другому реализована функция do_get в messages<char> facet'е: здесь также открывается каталог с любым именем, однако do_get() возвращает строку default, что соответствует пустому каталогу.

Было бы логичнее, если бы и wchar_t версия facet'а messages была реализована таким же образом.

Работа messages<wchar_t>::do_get продемонстрирована в приведенном ниже примере.

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

Linux Standard Base C++ Specification 3.2, Chapter 9. Libraries, 9.1. Interfaces for libstdcxx, который ссылается на ISO/IEC 14882: 2003 Programming languages --C++, section 22.2.7.1.2

Пример

#include <iostream>
#include <locale>
using namespace std;

int main()
{
    locale loc;
    
    const messages<wchar_t>& ms = use_facet<messages<wchar_t> >(loc);
    messages_base::catalog cat = ms.open("*", loc);
    if(cat < 0)
    {
        cout << "Cannot open catalog.\n";
        return 0;
    }    
    wstring dfault = L"yes";
    wstring translation = ms.get(cat, 10, 210, dfault);

    if(translation == dfault)
    {
        cout << "get() returns default string.\n";
    }
    else
    {
        cout << "get() returns a string that differs from the default one.\n";
        cout << "Length of the returned string is "
            << translation.size() << ".\n";
    }
    ms.close(cat);
    return 0;
}

Компонент

libstdc++

Принято

GCC Bugzilla 13631

[В начало]