Как проверить, успешно ли построено новое 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,

Другие вопросы по тегам