[英]Type of a C++ string literal
出於好奇,我想知道C ++字符串文字的真正底層類型是什么。
根據我觀察到的情況,我會得到不同的結果。
一個類似於以下的類型測試:
std::cout << typeid("test").name() << std::endl;
給我看char const[5]
。
嘗試將字符串文字分配給不兼容的類型,如此(查看給定的錯誤):
wchar_t* s = "hello";
我得到a value of type "const char *" cannot be used to initialize an entity of type "wchar_t *"
從VS12的IntelliSense a value of type "const char *" cannot be used to initialize an entity of type "wchar_t *"
。
但我不知道它是如何成為const char *
因為VS12接受以下行:
char* s = "Hello";
我已經讀過,這在C ++ 11之前的標准中是允許的,因為它與C的復古兼容性,盡管s
修改會導致Undefined Behavior。 我假設這只是VS12還沒有實現所有的C ++ 11標准,並且這條線通常會導致錯誤。
閱讀C99標准( 從這里 ,6.4.5.5)表明它應該是一個數組:
然后使用多字節字符序列初始化靜態存儲持續時間和長度的數組 ,這足以包含序列。
那么, C ++字符串文字下面的類型是什么?
非常感謝你寶貴的時間。
字符串文字的類型確實是const char[SIZE]
,其中SIZE
是字符串的長度加上空終止字符。
你有時看到const char*
的事實是因為通常的數組到指針衰減。
但我不知道它是如何成為
const char *
因為VS12接受了以下行:char* s = "Hello";
這是C ++ 03中的正確行為(作為通常的const-correctness規則的一個例外),但它已被棄用。 符合C ++ 11的編譯器不應接受該代碼。
字符串文字的類型是char const[N]
,其中N
是包括終止空字符的字符數。 盡管這種類型不能轉換為char*
時,C ++標准包括一個條款,允許字符串文本的分配char*
。 添加此子句是為了支持兼容性,特別是對於當時沒有const
C代碼。
標准中類型的相關條款是2.14.5 [lex.string]第8段:
普通字符串文字和UTF-8字符串文字也稱為窄字符串文字。 窄字符串文字的類型為“n const char數組”,其中n是下面定義的字符串大小,並且具有靜態存儲持續時間(3.7)。
首先,C ++字符串文字的類型是n const char
的數組。 其次,如果要使用字符串文字初始化wchar_t,則必須編寫代碼:
wchar_t* s = L"hello"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.