我最近在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.
因此,最后一个函数接受左值和右值参数
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