无法从 const char* 转换为 const char *&
cannot convert from const char* to const char *&
我正在 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*
类型,我的代码应该可以工作。
您不能将非常量左值引用绑定到右值:
UTF8toWide(s.c_str());
^^^^^^^^^ this is rvalue
你需要左值:
const char* c = s.c_str();
std::wstring q = UTF8toWide(c); //ok
或通过删除引用更改 UTF8toWide,const char* in
可以
什么 std::string::c_str
returns 是右值,它不能绑定到对非常量的左值引用(即 const char*&
)。
如果 in
在 UTF8toWide()
中不会被修改,您可以将参数类型更改为 const char* in
或 const char* const & in
,或者改用命名变量。
string s = "hi";
const char* c = s.c_str();
wstring q = UTF8toWide(c);
除了改变函数外,还得解决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'[=10=]');
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());
或对 C++11 使用 #include <codecvt>
wstring q = std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>{ }.from_bytes(s);
我正在 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*
类型,我的代码应该可以工作。
您不能将非常量左值引用绑定到右值:
UTF8toWide(s.c_str());
^^^^^^^^^ this is rvalue
你需要左值:
const char* c = s.c_str();
std::wstring q = UTF8toWide(c); //ok
或通过删除引用更改 UTF8toWide,const char* in
可以
什么 std::string::c_str
returns 是右值,它不能绑定到对非常量的左值引用(即 const char*&
)。
如果 in
在 UTF8toWide()
中不会被修改,您可以将参数类型更改为 const char* in
或 const char* const & in
,或者改用命名变量。
string s = "hi";
const char* c = s.c_str();
wstring q = UTF8toWide(c);
除了改变函数外,还得解决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'[=10=]');
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());
或对 C++11 使用 #include <codecvt>
wstring q = std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>{ }.from_bytes(s);