声明“constexpr char*”字符串时是不是强制使用 const 关键字?

Posted

技术标签:

【中文标题】声明“constexpr char*”字符串时是不是强制使用 const 关键字?【英文标题】:Is const keyword mandatory while declaring"constexpr char*" string?声明“constexpr char*”字符串时是否强制使用 const 关键字? 【发布时间】:2021-10-15 11:44:06 【问题描述】:

我刚开始做的项目有很多追随者,

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

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

【问题讨论】:

【参考方案1】:

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

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)";
//                    ^~~~~

【讨论】:

【参考方案2】:

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

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

【讨论】:

constexpr 暗示 const。在 OP 声明中,constexpr 适用于指针,而const 适用于指针。

以上是关于声明“constexpr char*”字符串时是不是强制使用 const 关键字?的主要内容,如果未能解决你的问题,请参考以下文章

abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

宏常量,宏替换,const常量

abstract的方法是否可同时是static,是否可同时是native,是否可同时是synchronized?

Java面试题10 abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

在遍历集合时是应该用for还是用foreach

程序编译后运行时的内存分配