【问题标题】:C++ const correctness with string literals [duplicate]字符串文字的C ++ const正确性[重复]
【发布时间】:2013-02-27 14:43:39
【问题描述】:

根据 C++ 标准,字符串文字类型是 array of const char

auto constStr = "aaa";
char* nonConstStr = constStr; //Error here, cannot convert from 'const char *' to 'char *'
char* stillNonConstStr = "aaa"; //Why I don't have error here?

你能解释一下为什么在第 3 行我没有收到错误吗?

【问题讨论】:

  • @Rapptz 我似乎在 C++11 标准中找不到相同的 a 子句允许相同的“向后兼容转换”。我想它已被删除,所以链接的问题现在并不是真正的重复。
  • 因为它在历史上是允许的,而不是破坏成千上万的现有程序。
  • @Rapptz 关于 C 的问题+答案如何与关于 C++ 的问题重复?尤其是在两种语言实际上不同的地区。
  • @Angew 因为它们在这种情况下并没有你想象的那么大。

标签: c++ constants


【解决方案1】:

历史原因。即使字符串文字的类型是 const char 数组,过去也允许并且非常常见地将字符串文字分配给 char*。我相信它来自C 的日子,const 不存在,但不要引用我的话。它后来被弃用,但仍然允许,以免破坏使用它的代码库。该允许不会扩展到允许从 const char* 初始化 char* (也不是从不是文字的 const char 数组),这就是您的第二行失败的原因。在 C++11 中,禁止从字符串文字到 char* 的转换,但您的编译器可能还没有强制执行。

【讨论】:

    【解决方案2】:

    在 C++03 中,有一个特殊规则 ([conv.array]§2) 允许将字符串文字转换为类型 char*

    在 C++11 中,此规则不再存在。换句话说,您的代码是有效的 C++03,但无效的 C++11。

    【讨论】:

    • 格式错误已弃用 C++11。不无效。由于历史原因,这仍然会编译。 See here without -Wallhere with -Wall -Werror
    • @Rapptz:格式错误 == 无效。
    • @Rapptz 注意,illformed != deprecated"deprecated" 事情可行但不鼓励, “格式错误”(以及 “无效”,正如 Benjamin 所说),事情不起作用
    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多