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

ein*_*ica 10 c++ enums constexpr c++11

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

int foo(int x)
{
    enum : int { bar = 456 };
    return x + bar;
}
Run Code Online (Sandbox Code Playgroud)

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

Yak*_*ont 18

你可能会意外或故意强迫ODR存在,bar如果它是a 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

template<class T>
void test(T) {
  static_assert(std::is_same<T,int>::value);
}
Run Code Online (Sandbox Code Playgroud)

一个人会通过考试; 另一个不会.

同样,这可能是一个优点,一个缺点,或一个无意义的怪癖,具体取决于您使用令牌的方式.

  • 如果编译器决定这是必要的,它只会在内存中分配空间.如果你没有拿到地址,这是不太可能的; 即使编译器想要将数字存储在可能使用寄存器的某个地方,它通常也不想存储该值.在大多数情况下,`constexpr int`是仅在编译时存在的值. (2认同)