如何解决源文件全局范围内的 constexpr 变量
在源文件中声明 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
implies const
and const
on namespace scope implies internal linkage" 开始,多说
static constexpr int ORDER = 1;
甚至
namespace {
static constexpr int ORDER = 1;
}
如果您想要内部链接属性的有形证明,请考虑this compilation error
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。