【发布时间】:2013-01-06 18:31:53
【问题描述】:
C++11 引入了强类型枚举,语法为enum class。这些与整数类型不兼容,需要显式强制转换才能获得它们的数值。 C++11 还引入了以enum name : type {} 的形式为弱类型枚举指定存储类的能力。到这里为止都很好。
但是看起来即使弱类型枚举具有给定的存储类,其项目的类型仍然是int。我尝试使用 Visual Studio 2012,11 月 CTP 版本。考虑以下代码:
enum charEnum : char { A = 'A' };
enum longEnum : long long { Tera = 1000000000000 };
void fct(char val) {}
void fct(int val) {}
void fct(long long val) {}
int main()
{
static_assert(sizeof(A) == sizeof(char), "check charEnum size");
static_assert(sizeof(Tera) == sizeof(long long), "check longEnum size");
fct('A'); // calls fct(char)
fct(1); // calls fct(int)
fct(2ll); // calls fct(long long)
fct(A); // calls fct(int) !
fct(Tera); // calls fct(int), with truncation !
fct((long long)Tera); // calls fct(long long)
return 0;
}
为枚举值调用的重载函数始终为fct(int),即使这会导致值被截断。当然,通过显式强制转换,我们可以调用重载函数,但这在传统的 C++03 语法中也是可能的。
我是否遗漏了一些明显的东西?这是为什么?有比显式强制转换更好的解决方法吗?
【问题讨论】:
-
可能是因为枚举只能隐式转换为 int。
-
您的确定性从何而来?来自特定编译器的行为?如果是这样,您使用的是哪个编译器?您是否尝试过其他编译器?
-
@Walter 你说得对,我只尝试过使用 Visual Studio 2012 CTP。也许我错误地推断标准本身。
-
@SethCarnegie:这些不是您要查找的范围枚举。作用域枚举中有一个词
class或struct(这些关键字引入了作用域;int没有)。 -
@McNellis 完成。这是链接:connect.microsoft.com/VisualStudio/feedback/details/775916