是否有理由在此代码中对字符串文字使用const_cast?

时间:2014-10-21 17:53:23

标签: c++ c++11 string-literals const-cast

我正在查看一些我即将开始使用的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);

我错过了什么吗?

2 个答案:

答案 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指向字符串文字的指针是危险的,因为修改字符串文字会触发未定义的行为。如果它在没有演员阵容的情况下有效,那么就没有理由把它放在那里你应该马上改变它。