【问题标题】:Why constexpr should be static?为什么 constexpr 应该是静态的?
【发布时间】:2021-09-10 15:51:20
【问题描述】:

看了thisthis后,我还是对这种表达感到困惑:

static constexpr int = 0;

AFAIK,在 C++ 中:

  • static 确保整个执行过程中的终身内存地址以及并发线程的安全初始化
  • constexpr 确保时间编译评估为右值,这意味着它不应有内存地址

在我看来,它们很矛盾。 static 确保变量将具有长期内存地址,而 constexpr 确保相反的假设。令人惊讶的是,第一个链接中的讨论提到了这一点:

constexpr int x = 3;
const int* p = &x;

如果x是右值,我们怎么才能获得内存地址呢?

谁能解释一下?

【问题讨论】:

  • 您能否更明确地询问您是在询问本地范围静态还是命名空间范围静态?它们具有不同的含义,您所说的理解并不适用于两者。
  • 我不相信constexpr 和值类别(评估为右值)有任何联系。
  • 我的问题来自于看到许多班级成员声明static constexpr,我不确定应该是哪种。无论如何,你能简单解释一下吗?
  • 您的第一个链接与没有地址的constexpr 变量特别矛盾。
  • @Victor 静态类成员与其他静态类成员更加不同。您应该说明您的问题。

标签: c++ static constexpr


【解决方案1】:

static 有多种含义。在类中(根据您的评论),这意味着该成员与该类相关联,而不是该类的特定实例(对象)。

对于constexpr,这很有意义。这通常由编译器已知的值初始化,而不是来自 ctor 参数。

【讨论】:

  • 我理解正确了吗? static 确保所有对象只有一个变量,而 constexpr 确保其初始化在编译时完成。谢谢。
  • @Victor:是的,完全正确。 (此外,即使有 个对象,也有一个 static 变量。
猜你喜欢
  • 2014-05-27
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2011-02-16
  • 2021-11-06
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多