我习惯于使用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
的常数。无论您做什么,它都将没有地址,也不会占用内存空间(不仅是由于编译器的优化可能会或可能不会发生(。
在其他情况下,似乎没有一个令人信服的理由比另一个更喜欢一个。