通过引用传递带有枚举类的enum
Pass enum with enum class by reference
我有以下代码,我认为应该编译,但没有。
#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
整数引用的函数。
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++关于ENUM的问题。我得到的响应比枚举列表大
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 将枚举类型保存在位字段 [dcl.enum] [class.bit] 中
- C++:使用"enum class"的类内部的枚举
- 是空枚举 ( enum{}; ) 可移植的
- 是否可以使作用域枚举("enum class")在上下文中可转换为布尔值?
- 指定枚举基础类型时的"ISO C++ forbids forward references to 'enum' types"
- 通过引用传递带有枚举类的enum