невозможно преобразовать из const char * в const char * & - PullRequest
0 голосов
/ 07 июня 2018

Я пишу простую функцию UTF8 в WideStr на VC ++.

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 голосов
/ 07 июня 2018

Что std::string::c_str возвращает значение rvalue, которое нельзя привязать к lvalue-ссылке на неконстантное значение (т. Е. const char*&).

Вы можете изменитьтип параметра const char* in или const char* const & in, если in не будет изменен в UTF8toWide(), или использовать вместо него именованную переменную.

string s = "hi";
const char* c = s.c_str();
wstring q = UTF8toWide(c);
0 голосов
/ 07 июня 2018

В дополнение к изменению функции вы должны устранить утечку памяти, вызванную оператором 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);
0 голосов
/ 07 июня 2018

Нельзя связать неконстантную ссылку lvalue с rvalue:

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

вам нужно lvalue:

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

или изменить UTF8toWide, удалив ссылку, const char* in в порядке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...