【问题标题】:constexpr variable in source file global scope源文件全局范围内的 constexpr 变量
【发布时间】:2021-07-06 08:53:00
【问题描述】:

在源文件中声明 constexpr 常量的正确方法是什么?我分为两种方式:

constexpr int ORDER = 1;

namespace {
constexpr int ORDER = 1;
} // unnamed namespace

我质疑包装到未命名命名空间的有用性的原因是,在全局范围内,constexpr 意味着 static。和头文件的写法很像

static constexpr int ORDER = 1;

使static 只是重复,我假设同样适用于源文件,因此应该保证“在源文件的全局范围中声明的constexpr 变量”的内部链接。

是这样吗?有不同的建议吗?

【问题讨论】:

  • 命名空间在 C++ 中更可取。静态指定变量的生命周期。必须在编译时设置静态 constexpr 变量,因为它的生命周期是整个程序。如果没有 static 关键字,编译器就不必在编译时设置该值,并且可以决定稍后设置它。 PS:我会将这样的常量包装在一个结构中。
  • @Martin.Martinsson: constexpr 肯定需要编译时初始化(虽然 as-if 可以像往常一样做很多事情)。
  • 在标题中你应该use inline,而不是未命名的命名空间或static
  • @DavisHerring 我添加了一个赏金以引起对这个问题的更多关注。你同意现有的答案吗?您想提供不同的答案吗?
  • @LorahAttkins:这里的答案很好:我只是评论了标题案例,因为它更重要。

标签: c++ constexpr


【解决方案1】:

不需要将在源文件中声明的constexpr 变量包含在未命名的命名空间中。由于最终目标是实现内部链接,因此您必须记住this

属于命名空间范围的实体的名称具有内部 链接如果是名字

  • 一个变量,变量模板,
  • 函数,或显式声明为静态的函数模板;或
  • 非易失性const限定类型的非模板变量,除非
    • 显式声明为 extern,或
    • 它是内联或导出的,或者
    • 先前已声明且先前声明没有内部链接;或
  • 匿名联合的数据成员。

即既然"constexpr implies const and const on namespace scope implies internal linkage",就多此一举

static constexpr int ORDER = 1;

甚至

namespace {
  static constexpr int ORDER = 1;
}

如果您想要内部链接属性的有形证明,请考虑this compilation error

【讨论】:

    猜你喜欢
    • 2016-11-13
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2020-04-03
    • 2015-11-24
    • 2012-04-29
    • 2017-02-17
    相关资源
    最近更新 更多