我知道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应用于数组本身及其包含的指针.