我习惯用enum { my_const = 123; }
来定义我的常量,因为在类中,使用static constexpr
需要在类定义之外的一些代码(参见this question)。但是 - 功能体呢?最近我注意到人们在他们的功能中只有constexpr
个变量(实际上甚至没有打扰到const
他们),我想知道我是不是一个傻瓜谁是我的背后时代
int foo(int x)
{
enum : int { bar = 456 };
return x + bar;
}
所以,我的问题是:在函数体中使用枚举而不是constexpr变量有什么好处吗?
答案 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;在运行时。使用枚举,无论你做什么 - 它都没有地址,也没有占用内存空间(不仅仅是因为编译器优化可能会或可能不会发生)。
在其他情况下,似乎并不是一个令人信服的理由而不喜欢一个。