【问题标题】:Apply const_cast to a string literal?将 const_cast 应用于字符串文字?
【发布时间】:2013-07-02 14:29:14
【问题描述】:

我的 c++ 代码中需要一些预定义的常量 c 样式字符串文字。

我可以在字符串文字上直接使用const_cast<char *> 吗?

IE,对于期望只读 char* 参数的例程,这是否合法(并且是个好主意)?

const_cast<char*>("PIOFLAG")

或者我应该只使用char *pf="PIOFLAG" 并使用pf 作为参数?

【问题讨论】:

  • 您是否打算修改这些字符串?如果是这样,您就不能依赖文字是可写的。
  • 不,我不需要修改它,只需阅读。但 API 有 char* 而不是 const char*
  • 不能使用内置数组吗? char pf[] = "PIOFLAG";.
  • @mfontanini:如果字符串没有被修改,这并没有真正的帮助,但会占用更多空间。

标签: c++ string constants


【解决方案1】:

如果在采用char * 但实际上并未修改字符串本身的API 中使用该字符串,那么const_cast&lt;char *&gt;("SOME STRING") 就可以了。理想情况下,您应该修改 API 以使用 const 参数,这将使其更易于使用并反映现实。

【讨论】:

  • @AndrewJaffe:所以提交一个错误报告。您确定它不会尝试修改字符串吗?
【解决方案2】:

两者都没有。您只需使用自己的内存分配创建另一个char * 并将字符串复制到其中。

抛弃固有的const 对象的常量并对其进行修改最终会给您带来未定义的行为,因此这并不是一个好主意。即使您不打算修改对象,它仍然不是一个好主意,因为您破坏了 const 正确性的全部目的,并将您的代码暴露给他人以及您自己的突发奇想和幻想。

char *pf="PIOFLAG";

这种用法在 C++ 中已弃用,您必须在声明字符串文字时使用 const char *

【讨论】:

  • 这使用起来太复杂了:要决定如何删除分配的内存,您必须了解 API 如何使用它(这可能很棘手并且依赖于实现)。如果你进行强制转换,知道 API 不会改变它就足够了。
  • @anatolyg:对您的异议的简单回答:视情况而定。 OP 中没有足够的信息供我们决定。
【解决方案3】:

您可以通过这种方式对字符串文字进行 const_cast,但实际上并不需要它,因为存在到 char* 的隐式转换(已弃用)。

但是你不能通过那个指针修改字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 2016-08-03
    • 2018-10-02
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多