Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在这段代码中对字符串文字使用const_cast有什么原因吗?_C++_C++11_String Literals_Const Cast - Fatal编程技术网

C++ 在这段代码中对字符串文字使用const_cast有什么原因吗?

C++ 在这段代码中对字符串文字使用const_cast有什么原因吗?,c++,c++11,string-literals,const-cast,C++,C++11,String Literals,Const Cast,我正在看一些我即将开始使用的API的示例代码。以下模式让我有点困惑: char* str; str = const_cast<char*>("Hello World"); printf("%s ", str); 我遗漏了什么东西? 字符串文字是C中的非const char [n] < /c>,C++中是 const char [n] < /c>。C++版本的早期版本对代码“>代码> const 字符串进行了特殊的允许,以分配给非const < Cald*ch/,以与C进行向后兼

我正在看一些我即将开始使用的API的示例代码。以下模式让我有点困惑:

char* str;
str = const_cast<char*>("Hello World");

printf("%s ", str);

<>我遗漏了什么东西?

字符串文字是C中的非const <代码> char [n] < /c>,C++中是<代码> const char [n] < /c>。C++版本的早期版本对代码“>代码> const <代码>字符串进行了特殊的允许,以分配给非const < Cald*ch/<代码>,以与C进行向后兼容。但是,这种行为在C++ 03中被禁止,并且在C++ 11中是非法的,没有显式的转换,如所示的。
如果您只对C++11感兴趣,那么应该将
str
更改为
constchar*
。否则,您可以使用cast实现向后兼容性。

唯一可能的原因可能是
printf
在某些特定实现中需要
char*
。经过一些研究,情况似乎并非如此。另一方面,将指向非常量
char
的指针指向字符串文字是危险的,因为修改字符串文字会触发未定义的行为。如果它在没有演员阵容的情况下工作,就没有理由让它在那里,你应该马上更换。

更换它。原始代码非常接近未定义的行为领域。是的
put
没有做同样的事情。为什么在其他情况下,
put
会是一个更好的选择?@ValekHalfHeart哦,是的,那是胡说八道,没关系。在发布这篇文章之前,我读了假设的重复问题。不过,没有一个答案能直接回答我的问题。显然,这是合法的——正如另一个问题所问。我在问在任何情况下是否有充分的理由使用此模式。@DrewNoakes我忘记了
put
附加了一个换行符(以前从未使用过),但请注意GCC.interest。我怀疑这是幕后故事。所讨论的代码有很多跨平台的缺点。我使用的是C++11,但这段代码可能要追溯到C++03之前。您对const和readonly的区别是什么?我经常想知道如果你试图修改字符串文字会发生什么情况。@Drew语言可能允许你修改它,但这并不意味着这样做是安全的。@remyabel同意。但在这种情况下,你到底在改变什么?如果一个字符串文本在代码中重复,并且编译器在可执行文件中合并它们,这会改变另一个实例吗?该内存区域是否可以得到保护?我想这些问题的答案是‘视情况而定’:@DrewNoakes:正如我所说,字符串文字是只读数据(存储在只读内存中,如果您试图修改它,则其行为未定义),但并非所有编译器都将字符串文字视为
const char[]
,有些编译器将其视为
char[]
。我之所以区别是因为有一个。例如,通常不能将
常量字符*
分配给
字符*
,但将
常量字符[]
文本分配给
字符*
是一种特殊情况。没有C98。有C++98、C89和C99。
const char* str;
str = "Hello World";

printf("%s ", str);