const constexpr char*与constexpr char*

Bra*_*don 9 c++ c++11

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

但是,对于字符/字符串数组,我很困惑为什么编译器抱怨一个用于另一个.

例如,我有:

constexpr char* A[2] = {"....", "....."};

const constexpr char* B[2] = {"....", "....."};
Run Code Online (Sandbox Code Playgroud)

声明"A"我得到:

ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
Run Code Online (Sandbox Code Playgroud)

但声明"B"我没有得到任何警告.

为什么额外的const限定符会消除警告?他们两个都不是"const char*"吗?我问,因为两者都被声明,默认情况下constexpr应该使它成为一个const char*

我希望A没问题:S

Dav*_*son 10

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

constexpr告诉编译器您可以在编译时完全评估存储在这些数组中的指针.但是,它没有说明指针所指向的字符是否会发生变化.

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

const char * const B[2];
Run Code Online (Sandbox Code Playgroud)

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