C++ “如何修复”;状态错误(活动)E0513类型的值“;const wchar_t*”;无法分配给类型为“;wchar_t*”&引用;

C++ “如何修复”;状态错误(活动)E0513类型的值“;const wchar_t*”;无法分配给类型为“;wchar_t*”&引用;,c++,visual-studio,C++,Visual Studio,我正在尝试使用C更改文件的属性++ 我做错了什么? 代码完全被接受了 正如错误消息已经告诉我们的那样:字符串文字的类型是constchar[]或constwchar\u t[](取决于底层类型),并且您不能合法地将const数组分配给指向非const的指针(尽管有些编译器接受这样的代码,只是发出警告),只允许相反的方式 现在的问题是,如何摆脱这种困境 一般而言: 如果100%确信(真的,一点也不怀疑!)字符串不会被修改,您可以丢弃常量: wchar_t* ptr = const_cast<

我正在尝试使用C更改文件的属性++ 我做错了什么? 代码完全被接受了


正如错误消息已经告诉我们的那样:字符串文字的类型是
constchar[]
constwchar\u t[]
(取决于底层类型),并且您不能合法地将const数组分配给指向非const的指针(尽管有些编译器接受这样的代码,只是发出警告),只允许相反的方式

现在的问题是,如何摆脱这种困境

一般而言:

如果100%确信(真的,一点也不怀疑!)字符串不会被修改,您可以丢弃常量:

wchar_t* ptr = const_cast<wchar_t*>(L"...");
此时,您需要确保被调用的函数不会获得字符串的所有权:它会尝试释放字符串吗?它是否会将指针存储在某个地方以供以后使用,这样指向的数组必须比调用函数的作用域更长

如果是这样,您可能需要使用全局数组或
malloc
内存将字符串复制到

在特定情况下:

如果您仔细查看和函数的文档,就会发现所讨论的结构被传递给
const
参数。事实上,这将使指针保持不变,而不是指向的数据,但假设字符串不会被修改(如果需要,可以复制到某个地方,也可以写入某个文件),看起来还是很安全的,因此实际上您应该可以使用
const_cast
选项


旁注:该示例不会释放再次读取的字符串;现在所有权的问题很有趣(谁会再次释放他们)?不幸的是,文档中并没有精确描述…

1,如果您确定其他代码不会写入其中,您可以使用const_cast将constness丢弃。2、您可以使用类似于_wcsdup的东西对字符串进行可写复制,您也不应该忘记稍后释放它。3,您可以将字符串存储在全局或静态范围内的wchar_\t数组中。
wchar_t* ptr = const_cast<wchar_t*>(L"...");
wchar_t value[] = L"...";
ptr = value;