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

时间:2018-06-07 05:26:37

标签: c++ visual-c++

我在VC ++上写了一个简单的UTF8到WideStr函数。

MtoW.h

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

MtoW.cpp

#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);
}

的main.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 个答案:

答案 0 :(得分:2)

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

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

你需要左值:

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

或通过删除引用将UTF8更改为Wide,const char* in没问题

答案 1 :(得分:2)

std::string::c_str返回的是一个右值,它不能绑定到非常量的左值(即const char*&)。

如果const char* in未在const char* const & in中修改,或者使用命名变量,则可以将参数类型更改为inUTF8toWide()

string s = "hi";
const char* c = s.c_str();
wstring q = UTF8toWide(c);

答案 2 :(得分:1)

除了更改功能外,还必须解决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);