通过引用

时间:2016-06-24 18:46:20

标签: c++

我认为

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

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

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

1 个答案:

答案 0 :(得分:9)

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

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

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

您可以按值传递它,因为非类枚举可以隐式转换为其基础类型。并且您可以通过const&,因为隐式转换可以创建一个临时填充该引用。但是,您无法将枚举传递给对整数采用非const引用的函数。