[英]Where in the C++11 Standard does it say that char* p = “abc”; is ill-formed?
在C ++ 11標准中,它表示char* p = "abc";
是不是形成了?
這在C ++ 03中仍然有效(雖然已棄用),但在C ++ 11中已經發生了變化。 C ++ 11標准的附錄C(見C1.1)提到:
更改 :字符串文字使
const
字符串文字的類型從“
char
ofchar
”更改為“const char
數組。”char16_t
字符串文字的類型從“some-integer-type”數組更改為“const char16_t
數組”。char32_t
字符串文字的類型從“some-integer-type”數組更改為“const char32_t
數組”。寬字符串文字的類型從“wchar_t
數組”更改為“const wchar_t
數組”。基本原理 :這可以避免調用不適當的重載函數,該函數可能希望能夠修改其參數。
對原始特征的影響 :改變定義明確的特征的語義。
轉換難度 :句法轉換。 修復是添加一個演員:
char* p = "abc"; // valid in C, invalid in C++ void f(char*) { char* p = (char*)"abc"; // OK: cast added f(p); f((char*)"def"); // OK: cast added }
在C ++ 03中,這是隱式轉換規則的一個例外。 在C ++ 11中,這個異常消失了,這也許就是為什么你在標准中找不到這種情況的原因。
上面引用的段落已添加到附件C中(僅提供信息,而非規范性),以便您可以找到突破性變化的證據。
無論如何,有關段落是2.14.5 / 8:
普通字符串文字和UTF-8字符串文字也稱為窄字符串文字。 窄字符串文字的類型為“
n const char
數組 ”,其中n
是下面定義的字符串大小,並且具有靜態存儲持續時間(3.7)。
4.4 / 1(有關數組到指針的轉換,請參見4.2):
如果“
cv2 T
”比“cv1 T
” 更加cv
cv2 T
則可以將類型“指向cv1 T
指針”的prvalue轉換為“指向cv2 T
指針”的cv1 T
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.