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;
}
Run Code Online (Sandbox Code Playgroud)
调用枚举值的重载函数始终是fct(int),即使这会导致值的截断.当然,通过显式转换,我们可以调用重载函数,但这在传统的C++ 03语法中也是可能的.
我错过了一些明显的东西吗 这是为什么?有没有比明确演员更好的解决方法?
这是一个编译器错误.根据§7.2/ 9和§4.5/ 4:
§7.2/ 9:
枚举器的值或无范围的枚举类型的对象通过整数提升转换为整数(4.5)§4.5/ 4:
其底层类型为固定(7.2)的无范围枚举类型的prvalue可以转换为其基础类型的prvalue.此外,如果可以对其基础类型应用整数提升,则其基础类型固定的未范围枚举类型的prvalue也可以转换为提升的基础类型的prvalue.
最后一个应该转换为long long,而不是int.该char案件是争论的焦点.(!)
测试程序:
#include <iostream>
enum charEnum : char { A = 'A' };
enum longEnum : long long { Tera = 1000000000000 };
void fct(char val) { std::cout << "fct(char)" << std::endl; }
void fct(int val) { std::cout << "fct(int)" << std::endl; }
void fct(long long val) { std::cout << "fct(long long)" << std::endl; }
int main()
{
static_assert(sizeof(A) == sizeof(char), "check charEnum size");
static_assert(sizeof(Tera) == sizeof(long long), "check longEnum size");
fct('A');
fct(1);
fct(2ll);
fct(A);
fct(Tera);
fct((long long)Tera);
}
Run Code Online (Sandbox Code Playgroud)
MSVC2012NovCTP输出:
fct(char)
fct(int)
fct(long long)
fct(int)
fct(int)
fct(long long)
g ++ 4.7.1:
fct(char)
fct(int)
fct(long long)
fct(int)
fct(long long)
fct(long long)
| 归档时间: |
|
| 查看次数: |
1341 次 |
| 最近记录: |