声明“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】:const
和constexpr
有不同的行为,因为它们具有相同的前缀,您可能认为它们是相同的,但constexpr
表示将在编译时完成一个属性(或函数,或其他)时间,const
表示该属性不会被修改(它是一个不可变的值,您可以修改它,但这是未定义的行为),但可能无法在编译时进行评估。
此外,在这种特殊情况下,您无法从字符串文字创建 char *
,因为 -std=c++17
【讨论】:
constexpr
暗示 const
。在 OP 声明中,constexpr
适用于指针,而const
适用于指针。以上是关于声明“constexpr char*”字符串时是不是强制使用 const 关键字?的主要内容,如果未能解决你的问题,请参考以下文章
abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
abstract的方法是否可同时是static,是否可同时是native,是否可同时是synchronized?
Java面试题10 abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?