2013-03-12 82 views
13

const正确性按照C++标准的一个字符串类型是array of const charC++与字符串文字

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号线我没有得到一个错误?

+1

@Rapptz我似乎无法找到相同的子句,允许在C++ 11标准中进行相同的“向后兼容性转换”。我想它已被删除,所以链接的问题现在不是真正的重复。 – Angew 2013-03-12 07:16:28

+0

因为最好允许它历史允许,而不是破坏成千上万的现有程序。 – 2013-03-12 07:18:31

+3

@Rapptz关于C的一个问题+回答是关于C++的一个副本?特别是在两种语言实际不同的地区。 – Angew 2013-03-12 07:21:58

回答

12

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

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

+0

* illformed *或* deprecated * C++ 11。无效。由于历史原因,这仍然会编译。 [看这里没有-Wall](http://ideone.com/Itv8Hz)或[这里用-Wall -Werror](http://coliru.stacked-crooked.com/view?id=bf8d5e2bc40d1220813841a85bfdbe25-18aa934a8d82d638dde2147aa94cac94) – Rapptz 2013-03-12 07:24:48

+7

@拉普茨:illformed ==无效。 – 2013-03-12 07:26:39

+2

@Rapptz当心,* illformed *!= *弃用*,*“弃用”*事情工作,但气馁,*“格格不入”*(和*“无效”*,因为*本杰明*说)工作。 – 2013-03-12 08:09:30

14

历史原因。尽管字符串文字的类型是一个常量字符数组,但它曾经被允许并且很常见,可以从字符串文字分配到char*。我相信它来自C的日期,其中const不存在,但不要在此引用我。它后来被弃用,但仍然允许不破坏使用它的代码库。该限额不允许char*const char*(也不是来自const char数组)的初始化,这就是为什么你的第二行失败。在C++ 11中,从字符串文字到char*的转换被禁止,但是你的编译器可能还没有执行。