代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

无法从const char*转换为const char*&

  •  2
  • Rick Jim DeLaHunt  · 技术社区  · 7 年前

    我正在vc++上编写一个简单的utf8到widestr函数。

    h。

    #pragma once
    #include <Windows.h>
    #include <string>
    using namespace std;
    wstring UTF8toWide(const char*& in);
    

    波普

    #include "MtoW.h"
    #include <string>
    #include <cassert>
    using namespace std;
    wstring UTF8toWide(const char*& in) {
        int size = MultiByteToWideChar(CP_UTF8, 0, in, -1, NULL, 0);
        wchar_t* wide_str = new wchar_t[size];
        int result_size = MultiByteToWideChar(CP_UTF8, 0, in, -1, wide_str, size);
        assert(size == result_size);
        return wstring(wide_str);
    }
    

    主CPP

    #include <string>
    #include <iostream>
    #include "MtoW.h"
    using namespace std;
    int main()
    {
        string s = "hi";
        //s.c_str();
        //const char* q = "abc";
        //const char*& c = q;
        wstring q = UTF8toWide(s.c_str()); //error 
    }
    

    我得到了 cannot convert from const char* to const char *& 错误,为什么?
    s.c_str() 是一个 const char* 类型和我的代码应该可以工作。

    3 回复  |  直到 7 年前
        1
  •  2
  •   songyuanyao    7 年前

    什么 std::string::c_str 返回是一个rvalue,它不能绑定到对non const的左值引用(即 const char*& )

    您可以将参数类型更改为 const char* in const char* const & in 如果 in 不会在中修改 UTF8toWide() ,或者改用命名变量。

    string s = "hi";
    const char* c = s.c_str();
    wstring q = UTF8toWide(c);
    
        2
  •  2
  •   marcinj    7 年前

    不能将非常量左值引用绑定到右值:

    UTF8toWide(s.c_str());
               ^^^^^^^^^ this is rvalue
    

    你需要左值:

    const char* c = s.c_str();
    std::wstring q = UTF8toWide(c); //ok
    

    或者通过删除引用将utf8更改为ide, const char* in 可以

        3
  •  1
  •   Barmak Shemirani    7 年前

    除了更改函数外,还必须解决由 new 操作员。呼叫 delete[] wide_str; 在退出函数或使用 std::wstring 首先:

    std::wstring UTF8toWide(const char* in) 
    {
        if (!in)
            return std::wstring(L"");
        int size = MultiByteToWideChar(CP_UTF8, 0, in, -1, NULL, 0);
        std::wstring ws(size, L'\0');
        int result_size = MultiByteToWideChar(CP_UTF8, 0, in, -1, &ws[0], size);
        assert(size == result_size);
        return ws;
    }
    
    std::string s = u8"ελληνικά";
    std::wstring q = UTF8toWide(s.c_str());
    

    或使用 #include <codecvt> C++ 11

    wstring q = std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>{ }.from_bytes(s);