【发布时间】:2021-10-15 11:44:06
【问题描述】:
我刚开始做的项目有很多追随者,
constexpr const char* str = "Some Character(s)";
我想明白,上面语句中的“const”关键字是不是多余的,因为 constexpr 是隐式常量?
【问题讨论】:
标签: c++11 constants c++17 constexpr
我刚开始做的项目有很多追随者,
constexpr const char* str = "Some Character(s)";
我想明白,上面语句中的“const”关键字是不是多余的,因为 constexpr 是隐式常量?
【问题讨论】:
标签: c++11 constants c++17 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。在 OP 声明中,constexpr 适用于指针,而const 适用于指针。