簡體   English   中英

在C ++ 11標准中,它表示char * p =“abc”;是不是形成了?

[英]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 of char ”更改為“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM