c – 与r值和l值混淆

我最近在C 11的白皮书上读过,如果我写的,

void foo(X&)

这将被称为l值而不是r值

如果我写,

void foo(const X&)

这将被调用r值和l值.

有人能给我一个例子,这意味着什么?

解决方法:

此函数接受左值引用

void foo(X&)

并试图用右值调用它会产生错误.

此函数需要一个const左值引用

void foo(const X&)

但有一个问题:

An rvalue may be used to initialize a const lvalue reference, in which case the lifetime of the object identified by the rvalue is extended until the scope of the reference ends.

cppreference

因此,最后一个函数接受左值和右值参数

struct X {};

void foo(X&) {
}

void fooC(const X&) {
}

int main() { 
   X obj;
   // foo(std::move(obj)); // Error - non-const
   foo(obj); // Valid
   fooC(obj); // Valid
   fooC(std::move(obj)); // Valid
}

有关更多信息,请查看此处:reference initialization或检查[dcl.init.ref] / p5

上一篇:spring事务的传播行为


下一篇:c – 按值返回指针不会移动对象