c – 我应该更喜欢一个函数中的常量:constexpr const或enum?

我习惯于使用枚举{my_const = 123; },因为在类中,使用静态constexpr需要类定义之外的一些代码(参见 this question).但是 – 在功能体中呢?最近我一直在注意到人们只是在他们的功能中使用了constexpr变量(甚至没有打扰他们),我想知道我是否是一个愚蠢的人,与我的时代背后
int foo(int x)
{
    enum : int { bar = 456 };
    return x + bar;
}

所以,我的问题是:在函数体中使用枚举是否有任何好处,而不是使用constexpr变量?

解决方法

如果是constexpr int bar = 456,那么你可能会意外地或者有意的强制ODR存在bar,这是不可能的:int {bar = 456} ;.

这可能或可能不是双方的优势.

例如

int baz(int const* ptr ) {
  if (ptr) return 7; return -1;
}
int foo(int x)
{
  // enum : int { bar = 456 };
  constexpr int bar = 456;
  return x + baz(&bar);
}

枚举版本不编译,constexpr int一个.一个constexpr int可以是一个左值,一个枚举器(列出的枚举常量之一)不能.

枚举值实际上不是int,而constexpr int实际上是一个int.如果你通过它,这可能很重要

template<class T>
void test(T) {
  static_assert(std::is_same<T,int>::value);
}

一个会通过测试;另一个不会.

再次,这可能是一个优点,一个缺点,或者一个无意义的怪癖,取决于你如何使用令牌.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...