Как проверить, успешно ли построено новое codecvt_byname - PullRequest
0 голосов
/ 27 ноября 2011

Есть ли стандартный способ проверить, успешно ли сконструировано новое 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 Ответ

0 голосов
/ 04 декабря 2011

Раздел [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.

...