声明 "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)";
// ^~~~~
const
和 constexpr
有不同的行为,因为它们有相同的前缀,你可能认为它们是相同的,但 constexpr
表示属性(或函数,或其他)将在编译时完成,并且 const
意味着该属性不会被修改(它是一个不可变的值,您可以修改它,但那是未定义的行为),但可能无法评估在编译时。
此外,在那种特殊情况下,您无法从字符串文字创建 char *
,因为 -std=c++17
我刚开始做的项目有很多如下的例子,
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)";
// ^~~~~
const
和 constexpr
有不同的行为,因为它们有相同的前缀,你可能认为它们是相同的,但 constexpr
表示属性(或函数,或其他)将在编译时完成,并且 const
意味着该属性不会被修改(它是一个不可变的值,您可以修改它,但那是未定义的行为),但可能无法评估在编译时。
此外,在那种特殊情况下,您无法从字符串文字创建 char *
,因为 -std=c++17