2013-03-12 58 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*的轉換被禁止,但是你的編譯器可能還沒有執行。