【问题标题】:Assigning string literals to char*将字符串文字分配给 char*
【发布时间】:2011-09-23 11:01:39
【问题描述】:

以下代码在 C++0x 中是否合法、已弃用或非法?

char* p = "foobar";

我最初是在评论here 时提出这个问题的。

【问题讨论】:

  • 它继续工作,但风格仍然很差。
  • GCC 4.6 说“不推荐使用从字符串常量到 char* 的转换”。
  • 嗯,应该是const char*,更正确

标签: c++ pointers c++11 deprecated string-literals


【解决方案1】:

转化

char* p = "foobar";

在 C++98/C++03 中已弃用,在 C++0x 中已被移除(即,§4.2/2 被移除)。

因此,代码在 C++0x 中无效

但是,MinGW g++ 4.4.1 仍然只发出警告,而不是错误。

C++98/C++03 §4.2/2(在 C++0x 中被删除):


不是宽字符串文字的字符串文字(2.13.4)可以转换为“指向char的指针”类型的右值;宽字符串文字可以转换为“指向wchar_t 的指针”类型的右值。无论哪种情况,结果都是指向数组第一个元素的指针。仅当存在显式适当的指针目标类型时才考虑这种转换,而不是当一般需要从左值转换为右值时。 [注意:此转换已弃用。见附录 D。] 为了在重载决议 (13.3.3.1.1) 中排名,这种转换被认为是数组到指针的转换,然后是限定转换 (4.4)。 [示例:"abc" 转换为“指向const char 的指针”作为数组到指针的转换,然后转换为“指向char 的指针”作为限定转换。 ]

【讨论】:

  • 即使是带有-std=c++0x 的g++ 4.4.5 也只会发出警告。
  • 所以 §4.2/2 最初是关于字符串文字到 char* 的转换,我想?如果可能的话,如果您可以将 C++03 标准中的该段落作为引用包含在内,那就太酷了:)
  • @Fred:我添加了 C++03 中的段落。 @Alf:我希望你没问题。
  • @Alf:实际上我是直接从 C++03 标准复制的,而不是从 C++98 标准复制的。如果您确定它与 C++98 中的相同,则您的更改不会受到影响,但是如果更改了,那现在就错了。
  • +1,我重新检查了标准,它确实将其列为 C 和 C++ 之间的区别:§C.1.1 [diff.lex] 包含示例:char* p = "abc"; // legal in C, illegal in C++。更改的基本原理是:这样可以避免调用不适当的重载函数,该函数可能期望能够修改其参数。
【解决方案2】:

我相信这在 C++0x 中现在是非法的。 C++03 对遗留代码的这种转换有一个特殊的警告,但是 C++0x 删除了它,现在你违反了 const 正确性。

当然,我不知道是否有任何真正的编译器将其删除,但他们会在他们的权利范围内。

【讨论】:

    猜你喜欢
    • 2012-01-11
    • 2012-05-03
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多