Как проверить, успешно ли построено новое codecvt_byname
Есть ли стандартный способ проверить, является ли конструкция новой std::codecvt_byname
удалось?
Я экспериментировал со следующей программой:
// cl /nologo /Fetest_codecvt_byname.exe /EHsc test_codecvt_byname.cpp && test_codecvt_byname
// g++ -o test_codecvt_byname test_codecvt_byname.cpp && test_codecvt_byname
#include <cstdlib>
#include <iostream>
#include <locale>
#include <new>
#include <stdexcept>
int main()
{
try {
new std::codecvt_byname<wchar_t, char, mbstate_t>(".nonsense");
} catch (const std::exception& ex) {
std::cerr << "Error: " << ex.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
libstdC++ в Windows, по-видимому, выбрасывает std::runtime_error
объект, если названная локаль не поддерживается. Однако реализация STL в Microsoft Visual C++ не исключение.
Не зная, какой компилятор C++ будет компилировать код, как я могу проверить, является ли конструкция новой std::codecvt_byname
удалось? В качестве альтернативы, есть ли способ проверить, будет ли строительство успешным, если не будет сценария нехватки памяти?
1 ответ
Раздел [22.3.1.1.2], Класс locale::facet
FDIS C++11 заявляет:
Для некоторых стандартных граней стандарт "...
_byname
"класс, производный от него, реализует семантику виртуальной функции, эквивалентную этому аспекту локали, созданнойlocale(const char*)
с тем же именем.
Стандарт, к сожалению, не требует исключения от std::codecvt_byname
конструктор, если именованная локаль неверна, как и явный std::locale
конструктор locale(const char*)
, Тем не менее, обходной путь должен попытаться построить локаль и use_facet
codecvt
аспект вместо того, чтобы пытаться использовать std::codecvt_byname
,