C++:将枚举作为值传递还是作为常量引用传递更好

C++: Is it better to pass an enum as a value or as a const reference?

本文关键字:常量 引用 更好 值传 枚举 C++      更新时间:2023-10-16

这里有两个相关的问题:

A( enum是如何实现的?例如,如果我有代码:

enum myType
{ 
   TYPE_1,
   TYPE_2
};

实际发生了什么?我知道你可以把TYPE_1和TYPE_2看作int,但它们实际上只是int吗?

B( 基于这些信息,假设传入的枚举不需要更改,那么将myType作为值或常量引用传递到函数中更有意义吗?

例如,哪个是更好的选择:

void myFunction(myType x){ // some stuff }

void myFunction(const myType& x) { // some stuff }

从速度上看,这几乎肯定无关紧要——任何一个像样的C++编译器都只会通过一个int。

重要的一点是可读性——这将使您的代码对读者更明显?

如果很明显,这些枚举实际上只是int,那么我会按值传递它们,就好像它们是int一样。使用const-ref可能会让程序员三思而后行(从来都不是一个好主意!(

然而,如果您稍后要用类替换它们,那么保持API不变并强制执行const-ness可能是有意义的。

C++标准(§7.2/5(保证枚举的底层类型是一个整数类型,它可以表示枚举中定义的所有枚举器值。因此,按值传递,不要让代码变得过于复杂。

我知道你可以把TYPE_1和TYPE_2看作int,但它们实际上只是int吗?

是的。它们是积分型,很可能它们的类型只是int,因为这是最自然的类型。所以你可以通过价值传递;通过参考不会给你带来任何显著的优势。

顺便说一句,为了供您参考,§7.2/5节说,

枚举的基础类型是可以表示枚举中定义的所有枚举器值。是的实现定义使用哪个积分类型作为基础枚举的类型,但基础类型不应为大于int,除非枚举器的值不能容纳在int中或无符号int。如果枚举器列表为空,则基础类型就好像枚举有一个值为0的枚举器一样。这个sizeof((的值应用于枚举类型,该类型是枚举类型或枚举器是应用的sizeof((的值到基础类型。

通过值传递内置的简单类型(char、short、int、enum、float、指针(

枚举被实现为整数,您甚至可以显式地为它们指定值。

typedef enum
{
    FIRST_THING,
    SECOND_THING
} myType;

然后像使用int一样使用它。按值传递它。