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)
一个人会通过考试; 另一个不会.
同样,这可能是一个优点,一个缺点,或一个无意义的怪癖,具体取决于您使用令牌的方式.