我认为
#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)。 typedef的变量可以传递给foo
函数,但枚举(枚举类uint8_t
)不能。
这在我的项目中意味着我无法将所有枚举传递给单个重载函数 - 看起来我必须为每个可能的枚举创建一个重载。
是否有一种优雅的方式来编译,或者我是否必须通过引用传递第二个变量?
答案 0 :(得分:9)
C ++中的枚举不仅仅是将名称应用于整数;我们有const int
个变量。枚举在概念上表示一个整数,它只能存储一组特定值中的一个。
Typedef是别名;它们在给定类型的各个方面都是相同的。枚举是不同的类型。他们使用他们的底层类型,并且可以转换到它,但它们不是与其基础类型相同的相同的类型。
因此,对uint8_t
的引用与枚举的引用不同,即使该枚举使用uint8_t
作为其基础类型。因此,从引用到枚举转换为引用到底层类型是非法转换,以及打破严格的别名。
您可以按值传递它,因为非类枚举可以隐式转换为其基础类型。并且您可以通过const&
,因为隐式转换可以创建一个临时填充该引用。但是,您无法将枚举传递给对整数采用非const
引用的函数。