在源文件中声明 constexpr 常量的正确方法是什么?我分为两种方式:
constexpr int ORDER = 1;
对
namespace {
constexpr int ORDER = 1;
} // unnamed namespace
我质疑包装到未命名命名空间的有用性的原因是因为在全局范围内,
constexpr
意味着static
。与头文件中的写入方式非常相似
static constexpr int ORDER = 1;
使
static
只是重复,我假设同样应该适用于源文件,因此应保证“在源文件的全局范围中声明的constexpr
变量”的内部链接。
是这样吗?有不同的建议吗?
不需要将在源文件中声明的
constexpr
变量包含在未命名的命名空间中。由于最终目标是实现内部链接,因此您必须记住this:
属于命名空间范围的实体的名称具有内部 链接 如果它是
的名称
- 显式声明为静态的变量、变量模板、函数或函数模板;或
- 非易失性const限定类型的非模板变量,除非
- 它被显式声明为 extern,或者
- 它是内联的或导出的,或者
- 之前已申报且之前的申报不存在内部关联;或
- 匿名联合体的数据成员。
即因为命名空间范围上的“
constexpr
意味着const
和const
意味着内部链接”,所以说是多余的
static constexpr int ORDER = 1;
甚至
namespace {
static constexpr int ORDER = 1;
}
如果您想要内部链接属性的切实证明,请考虑此编译错误