源文件全局范围内的 constexpr 变量

问题描述 投票:0回答:1

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

constexpr int ORDER = 1;

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

我质疑包装到未命名命名空间的有用性的原因是因为在全局范围内,

constexpr
意味着
static
。与头文件中的写入方式非常相似

static constexpr int ORDER = 1;

使

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

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

c++ constexpr
1个回答
3
投票

不需要将在源文件中声明的

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

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

的名称
  • 显式声明为静态的变量、变量模板、函数或函数模板;或
  • 非易失性const限定类型的非模板变量,除非
    • 它被显式声明为 extern,或者
    • 它是内联的或导出的,或者
    • 之前已申报且之前的申报不存在内部关联;或
  • 匿名联合体的数据成员。

即因为命名空间范围上的

constexpr
意味着
const
const
意味着内部链接”
,所以说

是多余的
static constexpr int ORDER = 1;

甚至

namespace {
  static constexpr int ORDER = 1;
}

如果您想要内部链接属性的切实证明,请考虑此编译错误

© www.soinside.com 2019 - 2024. All rights reserved.