如何检查新codecvt_byname的构造是否成功

时间:2011-11-27 13:15:21

标签: c++ localization codecvt

是否有标准的方法来检查新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;
}
如果不支持命名的语言环境,Windows上的libstdc ++显然会抛出std::runtime_error对象。但是,Microsoft Visual C ++的STL实现不会引发异常。

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

1 个答案:

答案 0 :(得分:0)

C ++ 11 FDIS的第[22.3.1.1.2]节,类locale::facet

  

对于某些标准方面,从中派生的标准“... _byname”类实现了虚拟函数语义,该语义等效于由locale(const char*)构造的具有相同名称的语言环境的方面。 / p>

遗憾的是,如果命名的语言环境无效,则std::codecvt_byname构造函数不会抛出异常,显式std::locale构造函数locale(const char*)也是如此。但是,解决方法是尝试构建区域设置和use_facet codecvt方面,而不是尝试使用std::codecvt_byname