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 Visual C++ 的 STL 实现不会引发异常。

不知道哪个 C++ 编译器会编译代码,如何检查新的构造是否std::codecvt_byname成功?或者,如果没有内存不足的情况,有没有办法检查构造是否会成功?

4

1 回答 1

0

C++11 FDIS 的[22.3.1.1.2] 节 Classlocale::facet指出:

对于某些标准方面_byname,从它派生的标准“...”类实现了locale(const char*)与由同名构造的区域设置方面等效的虚函数语义。

std::codecvt_byname不幸的是,如果指定的语言环境无效,则标准不要求构造函数抛出异常,显式std::locale构造函数也是如此locale(const char*)。但是,一种解决方法是尝试构建语言环境和方面use_facetcodecvt而不是尝试使用std::codecvt_byname.

于 2011-12-03T22:26:36.830 回答