【问题标题】:Pass enum with enum class by reference通过引用传递枚举与枚举类
【发布时间】:2016-06-24 18:46:19
【问题描述】:

我有the following code 我认为应该编译但不编译。

#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)不能。

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

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

【问题讨论】:

  • testenum 可以与uint8_t 相互转换,但它们并不相同。您所看到的是转换的结果是一个不能绑定到非 const 引用的右值。

标签: c++


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多