【发布时间】:2023-03-15 10:35:01
【问题描述】:
我知道 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 限定符会消除警告?无论如何,它们都不是“const char *”吗?我问是因为两者都用constexpr 声明,默认情况下应该使它成为const char*?
我希望 A 没问题:S
【问题讨论】:
-
constexpr适用于指针,使其成为const,但不适用于它指向的对象。因此,这是您可能需要结合使用const和constexpr的少数情况之一。 -
constexpr char*是char* const。constexpr说明符适用于对象的整个类型——也就是说,它适用于声明——,const是一个限定符(属于一种类型)。