- 此问题在此处已有答案**:
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处理。"
2条答案
按热度按时间wljmcqd81#
(uint16_t)thingy
是一个 rvalue,它是一个临时值,在完整表达式完成后会立即消失。C++不允许将 lvalue 引用绑定到右值。要么你需要把参数设为右值引用:
或者您需要使用常量引用:
或者使用您传递的变量:
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值参考 * 是合适的结合。