2015-05-31 222 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