我应该更喜欢在函数中的常数:constexpr const或enum



我习惯于使用enum { my_const = 123; }定义常数,因为在类中,使用static constexpr需要类定义之外的某些代码(请参阅此问题(。但是 - 功能机构中呢?最近,我一直在注意到人们只是在功能中使用constexpr变量(实际上甚至不用费用const(,我想知道我是否是傻瓜

int foo(int x)
{
    enum : int { bar = 456 };
    return x + bar;
}

所以,我的问题是:在功能体内使用Enum的而不是ConstexPR变量有任何好处?

您可以意外或故意 bar的odr存在,如果是 constexpr int bar = 456;,则可以使用enum : 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);
}

enum版本未编译,constexpr int一个版本。constexpr int可以是lvalue,枚举者(列出的枚举常数之一(不能。

枚举值实际上不是int,而constexpr int实际上是int。如果将其传递给

,这可能很重要
template<class T>
void test(T) {
  static_assert(std::is_same<T,int>::value);
}

一个人将通过测试;另一个不会。

再次,这可能是一个优势,缺点或毫无意义的怪癖,具体取决于您的使用方式。

基于 @yakk的单线(但这是我自己的看法(:

,如果您不能在运行时允许常数作为"变量"存在,则可能需要使用基于enum的常数。无论您做什么,它都将没有地址,也不会占用内存空间(不仅是由于编译器的优化可能会或可能不会发生(。

在其他情况下,似乎没有一个令人信服的理由比另一个更喜欢一个。

最新更新