我应该更喜欢函数中的常量:constexpr const还是enum?

时间:2017-04-24 18:52:10

标签: c++ c++11 enums constexpr

我习惯用enum { my_const = 123; }来定义我的常量,因为在类中,使用static constexpr需要在类定义之外的一些代码(参见this question)。但是 - 功能体呢?最近我注意到人们在他们的功能中只有constexpr个变量(实际上甚至没有打扰到const他们),我想知道我是不是一个傻瓜谁是我的背后时代

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

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

2 个答案:

答案 0 :(得分:18)

如果是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可以是左值,枚举器(列出的枚举常量之一)不能。

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

,这可能很重要
template<class T>
void test(T) {
  static_assert(std::is_same<T,int>::value);
}
一个人将通过测试;另一个不会。

同样,这可能是一个优势,一个缺点,或一个毫无意义的怪癖,具体取决于你如何使用令牌。

答案 1 :(得分:1)

以@ Yakk为基础的单行(但这是我自己的看法):

如果你不能允许你的常量作为变量存在,那么使用基于enum的常量可能是必要的&#34;在运行时。使用枚举,无论你做什么 - 它都没有地址,也没有占用内存空间(不仅仅是因为编译器优化可能会或可能不会发生)。

在其他情况下,似乎并不是一个令人信服的理由而不喜欢一个。