[英]How to convert std::string to std::vector<std::byte> in C++17?
[英]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.