繁体   English   中英

C ++ 11中弱类型枚举的基础类型

[英]Underlying type of weak typed enum in C++11

C ++ 11引入了强类型枚举,语法为enum class 这些与整数类型不兼容,需要显式强制转换才能获取其数值。 C ++ 11还引入了为enum name : type {}形式的弱类型枚举指定存储类的功能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语法中也是可能的。

我错过了一些明显的东西吗 这是为什么? 有没有比明确演员更好的解决方法?

这是一个编译器错误。 根据§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);
}

MSVC2012NovCTP输出:

FCT(炭)
FCT(INT)
fct(很长)
FCT(INT)
FCT(INT)
fct(很长)

g ++ 4.7.1:

FCT(炭)
FCT(INT)
fct(很长)
FCT(INT)
fct(很长)
fct(很长)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM