2015-05-31 277 views
6

我知道const和constexpr之間的區別。一個是編譯時間常量,另一個是編譯時間或運行時常量。const constexpr char *與constexpr char *

但是,對於字符/字符串數組,我很困惑爲什麼編譯器會抱怨正在使用另一個。

比如我有:

constexpr char* A[2] = {"....", "....."}; 

const constexpr char* B[2] = {"....", "....."}; 

帶有聲明 「A」,我得到:

ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 

但聲明 「B」 我沒有得到任何警告。

爲什麼額外的const限定符會擺脫警告?無論如何,它們都不是「const char *」?我問,因爲兩者都是constexpr,這應該默認爲const char*

我期待一個要罰款:S

+3

'constexpr'適用於指針,使其成爲'const',但不是它指向的對象。所以這是少數情況下你可能需要結合'const'和'constexpr'的情況之一。 – 0x499602D2

+3

'constexpr char *'是一個'char * const'。 'constexpr'說明符適用於整個對象的類型 - 也就是說,它適用於聲明 - ,'const'是一個限定符(類型)。 – dyp

回答

8

const告訴你指着字符到不應該被寫入到編譯器。

constexpr告訴編譯器您在這些數組中存儲的指針可以在編譯時進行全面評估。但是,它並沒有說明指針指向的字符是否可能改變。

順便說一句,你可以寫這樣的代碼另一種方式是:

const char * const B[2]; 

第一const適用於字符,並應用到陣列本身,它包含指針第二const