Подробности
[В начало]
Проблема в реализации № S0730
Краткое описание
messages
Подробное описание
Из описания функции messages<>::do_get (22.2.7.1.2):
string_type do_get(catalog cat, int set, int msgid, const string_type& dfault) constReturns: 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
[В начало]