c++ 将枚举强制转换为其基础类型不满足我的函数签名[duplicate]

km0tfn4u  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(157)
    • 此问题在此处已有答案**:

Is it valid to bind non-const lvalue-references to rvalues in C++ 11?(modified)(2个答案)
5天前关闭。
我有一个像这样的函数...

void get_u16(const char *const key, uint16_t &output) {
    ...stuff goes here
}

和一个如下所示的枚举...

struct MyEnum {
  typedef enum : uint16_t {
    FOO = 0,
    BAR = 1,
  } Type;
};

我试着像这样调用我的函数...

MyEnum::Type thingy = MyEnum::BAR;
get_u16("some key", (uint16_t)thingy);

它向我抱怨说...

/project/components/Data/Data.cpp:498:77: error: cannot bind non-const lvalue reference of type 'uint16_t&' {aka 'short unsigned int&'} to an rvalue of type 'uint16_t' {aka 'short unsigned int'}

我很困惑。我的枚举的底层类型是uint16_t,我甚至试图在我的方法调用中将它强制转换为那个类型。有没有什么方法可以让我说"嘿,C++,我发誓你可以相信我。把这个当作uint16_t处理。"

wljmcqd8

wljmcqd81#

(uint16_t)thingy是一个 rvalue,它是一个临时值,在完整表达式完成后会立即消失。C++不允许将 lvalue 引用绑定到右值。
要么你需要把参数设为右值引用:

void get_u16(const char *const key, uint16_t &&output)

或者您需要使用常量引用:

void get_u16(const char *const key, uint16_t const &output)

或者使用您传递的变量:

uint16_t my_var = thingy;
get_u16("some key", my_var);
byqmnocz

byqmnocz2#

(uint16_t)thingy是一个 * 匿名临时 *,因此非const引用不能绑定到它。
void get_u16(const char *const key, const uint16_t &output) {
是一种解决办法。另一种可能是
void get_u16(const char *const key, const uint16_t &&output) {
因为 * R值参考 * 是合适的结合。

相关问题