我知道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
答案 0 :(得分:8)
const
告诉编译器你不应该写入你指向的字符。
constexpr
告诉编译器您可以在编译时完全评估存储在这些数组中的指针。但是,它并没有说出指针指向的字符是否会改变。
顺便说一下,你可以编写这段代码的另一种方式是:
const char * const B[2];
第一个const
适用于字符,第二个const
适用于数组本身及其包含的指针。