将字符串文字分配给char *

时间:2011-06-27 11:52:44

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

以下代码在C ++ 0x中是合法的,弃用的还是非法的?

char* p = "foobar";

我最初将此问题here作为评论。

2 个答案:

答案 0 :(得分:14)

转换

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”作为限定转换。 ]

答案 1 :(得分:2)

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

当然,我不知道是否有任何真正的编译器已删除它,但它们完全属于他们的权利。