通过引用或值枚举类C++11

Enum class C++11 by reference or value

本文关键字:枚举 C++11 引用      更新时间:2023-10-16

我基本上有两个问题,可能它们是相关的,所以我将它们放在一个问题中。

在传递给函数时,我们应该通过引用或值传递C++11中的枚举类吗。它有点继承基元类型,但它是传递的整个对象吗?由于枚举类是类型安全的;

enum class MyEnumClass : unsigned short {
    Flag1 = 0,
    Flag2 = 1,
    Flag3 = 2,
    Flag4 = 4,
};

现在假设我们有sig 功能

const char* findVal(const MyEnumClass& enumClass);
                                     ^
    should this be by const ref?   __|

我的另一个问题在这里-

SHOULD IT BE BY MOVE like (MyEnumClass&&) - I am still learning/understanding 
move semantics and rvalue so I am not sure if move semantics are only for 
constructors or can be for member or static funcs -

它不是继承基元类型,而是"告诉"实现使用指定的类型(unsigned short)作为枚举器的基础类型。

您可以简单地将枚举类对象视为任何其他类对象,并在将其传递给函数时应用相同的规则。

  • 如果要修改函数内部的枚举类对象,请通过引用传递它
  • 如果您只想读取函数内部的对象,请通过常量引用传递它

移动语义是一种语言运行时性能增强功能,它利用从右值移动的机会,而不是应用性能密集型的复制语义。r值引用和move语义不仅限于move构造函数和move赋值运算符,还可以与其他函数一起使用。如果你有可以利用这种优化的场景,那么利用它们是完全可以的。

考虑到枚举器使用指定的类型unsigned short作为底层类型,正如Alok Save所指出的,按值传递这些对象可能是个好主意(除非你想在函数中更改它们的值作为副作用,在这种情况下你应该使用引用。)