当将std :: string转换为std :: wstring时,C ++ 17编解码器抛出“错误转换”

我写了一个名为std::string的字符串类,我希望可以将std::wstring转换为std::wstring,也可以将std::string转换为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();

我在c ++ 17中使用库,所以我编写了如下代码。

在UString.h中:

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.cpp中:

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"

它应该像这样工作:

UString::w_str()

在linux,GCC 8.0.1中,该类工作正常,但是在Windows,Visual Studio 2017中,当我使用UString::wc_str()var materials = [{ sample: "A21" },{ sample: "A22" },{ sample: "A23" }],result = materials.map(({ sample }) => ({ [sample]: sample })); console.log(result);时,它无法工作并引发“错误的转换” ”错误。 我应该怎么做才能使这项工作?

vighi 回答:当将std :: string转换为std :: wstring时,C ++ 17编解码器抛出“错误转换”

wc_str()返回一个悬空指针;调用者对其返回值的任何使用都表现出未定义的行为,即在对象的生存期结束后对其进行访问。

STW(str)产生一个临时项,然后c_str()获取一个指向该临时项管理的数据的指针。然后临时文件被销毁,将数据取下来,指针悬空了。

本文链接:https://www.f2er.com/3167871.html

大家都在问