C++ 在这段代码中对字符串文字使用const_cast有什么原因吗?
我正在看一些我即将开始使用的API的示例代码。以下模式让我有点困惑: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进行向后兼
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);