为什么我们不能使用两个不同的枚举可互换?,例如作为函数参数?

Why We Couldn't Use Two Different enum Interchangeable?, e.g. As Function Parameter?

使用此代码:

enum A { _1 };
enum B { _2 };

void f(A) {}

int main()
{
        f(_2);
}

C++ 编译器抱怨无法将 B 转换为 A (try it on Wandbox),但使用 C 编译器我们只需收到警告 (我知道 C++ 不是 C):

main.c: In function ‘f’:
main.c:11:6: warning: type of ‘A’ defaults to ‘int’ [-Wimplicit-int]
   11 | void f(A)
      |      ^
main.c:11:6: warning: unused parameter ‘A’ [-Wunused-parameter]

(对我而言)这是有道理的,因为据我所知:enum 只是一个 int(无论 short intint、.. . 取决于枚举的值)。所以:

  1. 为什么 C++ 编译器不允许我将 B 用作 A
  2. 并且可以使用 f(static_cast<A>(_2));?

我的环境:

在 C++ 中,函数

void f(A) {}

被解释为“一个名为 f 的函数,它接受类型 A 的参数,并且它的参数没有名称。”但是,C 语言要求所有函数参数都有名称(这与 C++ 不同),因此 C 将其解释为“一个函数 f,它接受一个名为 A 的参数,并且由于 A 没有关联类型,编译器认为它正在寻找旧的C 代码,其中没有名称的参数的类型为 int,因此这是一个名为 f 的函数接受一个名为 A 的 int。”你从 gcc 得到的警告试图告诉你这一点,但如果没有那个背景故事,很难知道它意味着什么。 (使用没有类型的函数参数作为隐式整数是几十年来在 C 中不合法的东西,但为了向后兼容,一些 C 编译器无论如何都接受它。)

独立 - 枚举类型具有整数值但本身不是整数。在 C 和 C++ 中,您可以将整数隐式转换为枚举类型。但是,在 C++ 中(我相信 C 也是如此,但我不确定)枚举值不是整数,并且不能在没有转换的情况下被视为另一种类型的枚举值。所以是的,您可以通过将一种枚举类型显式转换为另一种来调用该函数,但是您不能通过传递错误类型的枚举常量来调用该函数。