通过引用传递带有枚举类的enum

Pass enum with enum class by reference

本文关键字:枚举 enum 引用      更新时间:2023-10-16

我有以下代码,我认为应该编译,但没有。

#include <cstdint>
typedef uint8_t testtype;
enum testenum : uint8_t {
};
void foo(uint8_t& v) {}
int main() {
    testtype bar;
    foo(bar);
    testenum baz;
    foo(baz);
    return 0;
}

我得到以下错误:

prog.cpp:15:9: error: invalid initialization of non-const reference of type 'uint8_t& {aka unsigned char&}' from an rvalue of type 'uint8_t {aka unsigned char}'
  foo(baz);

在我看来,这应该工作,因为一切都是相同的底层类型(uint8_t)。类型定义的变量可以传递给foo函数,但是枚举(它有枚举类uint8_t)不能。

在我的项目中,这意味着我不能将所有枚举传递给单个重载函数——看起来我必须为每个可能的枚举创建重载。

是否有一种优雅的方法来编译它,或者我必须通过第二个变量传递枚举,我可以通过引用传递?

c++中的枚举不仅仅是将名称应用于整数;我们有const int变量。从概念上讲,枚举表示一个整数,它只能存储一组特定值中的一个。

Typedefs是别名;它们在各方面都与给定的类型相同。枚举是不同的类型。它们使用它们的基础类型,并且它们可以转换为,但是它们的类型与它们的基础类型不同。

因此,对uint8_t的引用与对枚举的引用是不一样的,即使该枚举使用uint8_t作为其基础类型。因此,从引用到枚举类型转换为引用到底层类型是非法的转换,并且会破坏严格混叠。

可以按值传递,因为非类枚举可以隐式转换为其基础类型。您可以通过const&传递,因为隐式转换可以创建一个临时对象来填充该引用。但是,不能将枚举传递给接受非const整数引用的函数。