声明 "constexpr char*" 字符串时是否必须使用 const 关键字?

Is const keyword mandatory while declaring"constexpr char*" string?

我刚开始做的项目有很多如下的例子,

constexpr const char* str = "Some Character(s)";

我想明白,上面语句中的“const”关键字是不是多余的,因为constexpr是隐式常量?

它是强制性的,因为如果删除它,它将无法编译。此代码:

constexpr char *str = "Some Character(s)";

在 x64 GCC 11.2 (link) 上产生以下错误:

error: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    1 | constexpr char *str = "Some Character(s)";
      |                       ^~~~~~~~~~~~~~~~~~~

隐含的 const 是针对指针本身的,因此多余的 const 实际上是这样的:

constexpr const char *const str = "Some Character(s)";
//                    ^~~~~

constconstexpr 有不同的行为,因为它们有相同的前缀,你可能认为它们是相同的,但 constexpr 表示属性(或函数,或其他)将在编译时完成,并且 const 意味着该属性不会被修改(它是一个不可变的值,您可以修改它,但那是未定义的行为),但可能无法评估在编译时。

此外,在那种特殊情况下,您无法从字符串文字创建 char *,因为 -std=c++17