c++ - 为什么我们不能使用两个不同的可互换枚举?例如作为函数参数?
问题描述
使用此代码:
enum A { _1 };
enum B { _2 };
void f(A) {}
int main()
{
f(_2);
}
C++ 编译器抱怨无法转换B
为A
(在 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]
这是有道理的(对我来说),因为据我所知: Anenum
只是一个int
(无论如何short int
, int
, ... 取决于枚举的值)。所以:
- 为什么 C++ 编译器不允许我使用
B
asA
? - 而且很好用
f(static_cast<A>(_2));
?
我的环境:
- 编译器:
GCC 11.1.0
- 编译器标志:
-Wall -Wextra -Wpedantic
- 操作系统:
ArchLinux 5.13.13-arch1-1
解决方案
在 C++ 中,函数
void f(A) {}
被解释为“一个名为 f 的函数,它接受一个类型为 A 的参数,并且它的参数没有名称。” 但是,C 语言要求所有函数参数都有名称(这与 C++ 不同),因此 C 将其解释为“一个函数 f,它接受一个名为 A 的参数,并且由于 A 没有关联的类型,编译器认为它正在查看旧的C 代码中没有名称的参数具有 int 类型,所以这是一个名为 f 的函数,它采用一个名为 A 的 int。” 您从 gcc 收到的警告试图告诉您这一点,但如果没有背景故事,很难知道这意味着什么。(使用没有类型的函数参数作为隐式整数是几十年来一直不合法的 C 语言,但为了向后兼容,一些 C 编译器无论如何都接受它。)
独立 - 枚举类型具有整数值,但它们本身不是整数。在 C 和 C++ 中,您都可以将整数隐式转换为枚举类型。但是,在 C++ 中(我也相信 C,但我不确定)枚举值不是整数,不能在没有强制转换的情况下被视为另一种类型的枚举值。所以是的,您可以通过将一种枚举类型显式转换为另一种来调用该函数,但是您不能通过传递错误类型的枚举常量来调用该函数。
推荐阅读
- docker - Kubernetes:如何管理大量服务?将多个应用程序分组到一个服务中是一个坏主意吗?
- python - 如何在 django 中执行反向关系?
- python-3.x - Kivy - 在 .kv 文件中访问 ListProperty 的元素
- r - 如何在 R 中使用 gsub 从字符串中删除非数字字符?
- android - 将 google-services.json 导出和导入到 Firebase 中的新项目
- python - Python周期性定时器中断
- python - 格式化部分依赖图
- ffmpeg - FFMPEG 循环不会立即开始
- docker - Dockerfile 无法执行 CMD 命令(docker for windows)
- pdf - 获取 OcspClient 和 CrlClient 以在 LTV 时间戳中使用