const constexpr char* vs. constexpr char*

const constexpr char* vs. constexpr char*

本文关键字:char constexpr vs const      更新时间:2023-10-16

我知道const和constexpr之间的区别。一个是编译时间常量,另一个是编译时间常量或运行时常量。

然而,对于字符/字符串数组,我很困惑为什么编译器抱怨使用其中一个而不是另一个。

例如:

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* ?

我希望A是好的:S

const告诉编译器你所指向的字符不应该被写入。

constexpr告诉编译器,存储在这些数组中的指针可以在编译时完全求值。但是,它没有说明指针所指向的字符是否会改变。

顺便说一下,另一种写法是:
const char * const B[2];

第一个const适用于字符,第二个const适用于数组本身和它包含的指针。