2011-11-27 149 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