有没有一个标准的方法来检查新的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++将抛出std::runtime_error对象。但是,Microsoft Visual C++的STL实现不会抛出异常。
不知道代码由哪个C++编译器编译,如何检查新std::codecvt_byname的构建是否成功?或者,有没有一种方法可以在没有内存不足的情况下检查构造是否成功?
发布于 2011-12-04 06:26:37
C++11 FDIS第22.3.1.1.2节,locale::facet类规定:
对于某些标准方面,
从它派生的标准"...
_byname“类实现了与locale(const char*)使用相同名称构造的语言环境方面等效的虚拟函数语义。
遗憾的是,标准不要求在命名区域设置无效时由std::codecvt_byname构造函数抛出异常,显式std::locale构造函数locale(const char*)也是如此。但是,一种变通办法是尝试构造区域设置并对codecvt方面执行use_facet操作,而不是尝试使用std::codecvt_byname。
https://stackoverflow.com/questions/8285818
复制相似问题