const constexpr char* 与 constexpr char* 的区别

22

我知道const和constexpr的区别。一个是编译时常量(compile time constant),另一个是编译时或运行时常量(either compile time or runtime constant)。

但是,对于字符/字符串数组,我不明白为什么编译器会抱怨使用其中之一。

例如,我有以下代码:

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


10
constexpr 适用于指针,使其成为“const”,但不适用于它所指向的对象。因此,这是少数几种需要结合使用 constconstexpr 的情况之一。 - David G
8
constexpr char*是一个char* constconstexpr关键字应用于对象的整个类型 -也就是它应用于声明-, const是类型的修饰符。 - dyp
1个回答

16

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

constexpr告诉编译器,存储在这些数组中的指针可以完全在编译时计算出来。然而,它并没有说明指针指向的字符是否可能会改变。

顺便说一下,另一种编写此代码的方法是:

const char * const B[2];

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


1
我建议写成 char const * const B[2];,因为你可以从右到左阅读它并正确理解其含义:一个指向常量字符的常量指针。 - user904963

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接