Подробности
[В начало]
Проблема в реализации № 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
[В начало]