2011-11-27 148 views
0

是否有标准方法来检查构建新的std::codecvt_byname是否成功?如何检查构建新的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对象,如果指定的语言环境不支持。但是,Microsoft Visual C++的STL实现不会引发异常。

不知道哪个C++编译器会编译代码,我该如何检查新的std::codecvt_byname的构造是否成功?或者,有没有一种方法可以检查在没有内存不足的情况下构建是否会成功?

回答

0

段[22.3.1.1.2],locale::facet类,的C++ 11 FDIS规定:

对于一些标准小面一个标准的 “... _byname” 级,从它派生,实施虚拟函数语义等同于由locale(const char*)构造的具有相同名称的语言环境的方面。

标准遗憾的是并不需要一个例外,由std::codecvt_byname构造函数抛出如果指定的区域是无效的,一样明确std::locale构造locale(const char*)。但是,解决方法是尝试构建语言环境和use_facetcodecvt方面,而不是尝试使用std::codecvt_byname