簡體   English   中英

C ++字符串文字的類型

[英]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.

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