const constexpr char *与constexpr char *

时间:2015-05-31 18:30:43

标签: c++ c++11

我知道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限定符会消除警告? Aren&#t; t" const char *"无论如何?我问,因为两者都是constexpr声明的,默认情况下它应该是const char*

我希望A没事:S

1 个答案:

答案 0 :(得分:8)

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

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

顺便说一下,你可以编写这段代码的另一种方式是:

const char * const B[2];

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