2011-11-27 3 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 객체를 throw에. 그러나 Microsoft Visual C++의 STL 구현은 예외를 throw하지 않습니다.

어떤 C++ 컴파일러가 코드를 컴파일할지 모르는 경우 새로운 std::codecvt_byname의 생성이 성공했는지 어떻게 확인합니까? 또는, 메모리 부족 시나리오가 없다고 가정하여 성공 여부를 확인하는 방법이 있습니까?

답변

0

제 FDIS는 내용의 C++ 11 여기서 22.3.1.1.2, 클래스 locale::facet : 일부 표준

표준 패싯 "... _byname"에서 파생 클래스 구현 동일한 이름을 가진 locale(const char*)에 의해 구성된 로케일의 해당 패싯과 동일한 가상 함수 의미. 지정된 로케일이 유효하지 않은 경우 명시 적 std::locale 생성자 locale(const char*)을처럼

표준은 불행하게도 std::codecvt_byname 생성자에 의해 throw되는 예외를 필요로하지 않습니다. 그러나 해결 방법은 std::codecvt_byname을 사용하는 대신 로케일을 구성하고 use_facetcodecvt 패싯을 시도하는 것입니다.

관련 문제