我正在查看一些我即将开始使用的API的示例代码。以下模式让我有点困惑:
char* str;
str = const_cast<char*>("Hello World");
printf("%s ", str);
(实际上有一个巨大的案例陈述,其中str
分配给每个案例。)
请注意,printf
需要const char*
。这种错综复杂的转换有任何合理的目的吗?这段代码的作者在其他地方应用了许多以性能为导向的技巧,但没有解释这里发生了什么。
我的直觉是将此代码更改为:
const char* str;
str = "Hello World";
printf("%s ", str);
我错过了什么吗?
答案 0 :(得分:3)
字符串文字在C中是非const char[N]
,在C ++中是const char[N]
。早期版本的C ++标准特别允许将const
字符串文字分配给非const char*
,以便与C向后兼容。但是,这种行为在C ++ 03中已弃用,并且是现在在没有显式转换的情况下在C ++ 11中是非法的,例如显示的那个。
如果您只对C ++ 11感兴趣,则应将str
更改为const char*
。否则,您可以使用强制转换来实现向后兼容。
答案 1 :(得分:2)
唯一可能的原因可能是printf
在某些特定实现中需要char*
。经过一些研究,似乎并非如此。另一方面,指向非const char
指向字符串文字的指针是危险的,因为修改字符串文字会触发未定义的行为。如果它在没有演员阵容的情况下有效,那么就没有理由把它放在那里你应该马上改变它。