0

新しいものの建設が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;
}

std::runtime_error名前付きロケールがサポートされていない場合、Windows上のlibstdc++は明らかにオブジェクトをスローします。ただし、Microsoft VisualC++のSTL実装は例外をスローしません。

どのC++コンパイラがコードをコンパイルするかわからない場合、新しいものの構築がstd::codecvt_byname成功したかどうかを確認するにはどうすればよいですか?または、メモリ不足のシナリオがないと仮定して、構築が成功するかどうかを確認する方法はありますか?

4

1 に答える 1

0

locale::facetC ++ 11 FDISのセクション[22.3.1.1.2]、クラスは次のように述べています。

一部の標準ファセットの場合、それから派生した標準の「... 」クラスは、同じ名前で_byname構築されたロケールのファセットと同等の仮想関数セマンティクスを実装します。locale(const char*)

残念ながら、明示的なコンストラクターstd::codecvt_bynameのように、指定されたロケールが無効な場合、標準ではコンストラクターによって例外がスローされる必要はありません。ただし、回避策は、を使用するのではなく、ロケールとファセットの構築を試みることです。std::localelocale(const char*)use_facetcodecvtstd::codecvt_byname

于 2011-12-03T22:26:36.830 に答える