【发布时间】: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:这里的答案很好:我只是评论了标题案例,因为它更重要。