是否有标准的方法来检查新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
的构造是否成功?或者,有没有办法检查构造是否会成功,假设没有内存不足的情况?
答案 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
。