【问题标题】:Explain constexpr with const char*const [duplicate]用 const char*const 解释 constexpr [重复]
【发布时间】:2015-07-02 20:29:11
【问题描述】:

我有以下代码:

static constexpr const char*const myString = "myString";

你能解释一下有什么区别吗:

static const char*const myString = "myString";

在这种情况下,我们对 constexpr 有什么新功能?

【问题讨论】:

  • const = 只读。 constexpr = 常数。 const 对象可以更改,constexpr 对象不能。顶级const 无法更改,但strlen 等函数无法区分普通const 和顶级const,因此需要constexpr
  • 不是在第一个例子中static constexpr const char*conststatic constexpr const char* /*const*/一样吗? stackoverflow.com/questions/50609668/…

标签: c++ c++11 static constants constexpr


【解决方案1】:

以下引用 C++ 标准(9.4.2 静态数据成员)中描述了差异

3 如果非易失性 const 静态数据成员是整数或 枚举类型,其在类定义中的声明可以指定 一个大括号或相等初始化器,其中每个初始化器子句 是一个赋值表达式是一个常量表达式 (5.19)。 静态 字面量类型的数据成员可以在类定义中声明 使用 constexpr 说明符;如果是这样,其声明应指定一个 大括号或相等初始化器,其中每个初始化器子句是 赋值表达式是一个常量表达式。 [注:在这两个 在这些情况下,成员可能出现在常量表达式中。 ——尾注 ] 该成员仍应在命名空间范围内定义,如果它是 程序中使用的 odr-used (3.2) 和命名空间范围定义应 不包含初始化程序。

以两个程序为例

struct A
{
    const static double x = 1.0;
};

int main() 
{
    return 0;
}

struct A
{
    constexpr static double x = 1.0;
};

int main() 
{
    return 0;
}

第一个不会编译,而第二个会编译。

指针也一样

这个程序

struct A
{
    static constexpr const char * myString = "myString";
};

int main() 
{
    return 0;
}

将在这个程序中编译

struct A
{
    static const char * const myString = "myString";
};

int main() 
{
    return 0;
}

不会编译。

【讨论】:

  • 能否请您展示一个使用myString 的代码示例,上面的声明之一正确,而另一个声明不正确?
  • @CiaPan 查看我更新的帖子。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2013-01-25
  • 2019-07-20
相关资源
最近更新 更多