【问题标题】: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 是隐式常量?

【问题讨论】:

    标签: c++11 constants c++17 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 适用于指针。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2014-04-25
      相关资源
      最近更新 更多