簡體   English   中英

C++17 codecvt 在將 std::string 轉換為 std::wstring 時拋出“錯誤轉換”

[英]C++17 codecvt throw “bad conversion” when convert std::string to std::wstring

我寫了一個名為UString的字符串 class ,我想要的是可以將std::string轉換為std::wstring ,並將std::wstring轉換為std::string

我正在使用 c++17 中的庫,所以我編寫了如下代碼。

在 UString.h 中:

public:
        UString(std::string s);                         
    UString(std::wstring ws);   
private:
    std::string str;                                
    std::string WTS(const std::wstring & wstr);
    std::wstring STW(const std::string & str);
public:
        std::wstring w_str();                           
    const wchar_t* wc_str();

在 UString.cpp 中:

UString::UString(std::string s)
{
    str = s;
}
UString::UString(std::wstring ws)
{
    str = WTS(ws);
}
std::string UString::WTS(const std::wstring & wstr)
{
    std::string ret;
    try {
        std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
        ret = wcv.to_bytes(wstr);
    }
    catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
    }
    return ret;
}
std::wstring UString::STW(const std::string & str)
{
    std::wstring ret;
    try {
        std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
        ret = wcv.from_bytes(str);
    }
    catch (const std::exception & e) {
        std::cerr << e.what() << std::endl;
    }
    return ret;
}
std::wstring UString::w_str()
{
    return STW(str);
}
const wchar_t* UString::wc_str()
{
    return STW(str).c_str();
}

它應該像這樣工作:

UString ustr="test"; //the value should be "test"
UString ustr2=L"test2"; //the value should be "test2"
wcout<<ustr.w_str()<<endl; //the value should be "test"
cout<<ustr.wc_str()<<endl; //the value should be "test"

In linux,GCC 8.0.1,the class works fine,but in windows,Visual Studio 2017,when I use the UString::w_str() or UString::wc_str() ,it can not work and throw an "bad conversion"錯誤。 我應該怎么做才能完成這項工作?

wc_str()返回一個懸空指針; 調用者對其返回值的任何使用都會表現出未定義的行為,方法是在 object 的生命周期結束后訪問它。

STW(str)產生一個臨時文件,然后c_str()獲取一個指向由該臨時文件管理的數據的指針。 然后臨時對象被銷毀,數據隨之下降,指針變得懸空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM