4

我用枚举做了一个小测试,这就是我所拥有的:

enum anyoldname : char
{
    aa = 'a', ab = 'b', ac = 'c', ad = 'd'
};

int main()
{

    anyoldname i_have_an_enum_here = aa; // Would expect i_have_an_enum_here to be of type char?

    std::cout << i_have_an_enum_here << std::endl;

    return 0;
}

输出是: 98,除非我像这样显式转换为 char :

std::cout << (char)i_have_an_enum_here;

或更改anyoldnamechar.

为什么98打印值而不是b

顺便sizeof()返回1,即;1 个字节,一个char.

4

2 回答 2

3

在没有强制转换的情况下,编译器首先搜索 的适当成员函数std::ostream,然后找到一个 —— 的成员函数int。因此,它隐式地将您的 1 字节数类型anyoldname转换为 anint并调用成员函数。

用 g++ 4.8.1 编译你的程序,ostream::operator<<可以看到两个定义:

     U std::ostream::operator<<(std::ostream& (*)(std::ostream&))@@GLIBCXX_3.4
     U std::ostream::operator<<(int)@@GLIBCXX_3.4

第一个用于endl,第二个用于您的枚举。

通过显式转换为 char,编译器能够在以 an和 a作为输入的全局std::operator<<函数中找到完美匹配。然后它使用这个函数而不是进行隐式转换(再次)来调用成员函数。ostreamcharintostream

这两个符号变为:

     U std::ostream::operator<<(std::ostream& (*)(std::ostream&))@@GLIBCXX_3.4
     U std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char)

并且您的值被打印为字符而不是它们的十进制值。

于 2013-07-24T03:26:16.543 回答
1

如果您要阅读 C++ 标准(我现在只有 C++11)第 7.2 节第 5 段:

每个枚举都定义了一个不同于所有其他类型的类型。每个枚举也有一个基础类型。可以使用 enum-base 显式指定底层类型;如果没有明确指定,...

特别是这意味着您anyoldname实际上是一个单独的类型,其大小相同char(因为它的基础类型在声明中明确指定)。因此,没有理由隐式转换为char!

于 2013-07-24T02:34:04.320 回答