【发布时间】:2015-04-13 12:43:03
【问题描述】:
我发布了这个答案:https://stackoverflow.com/a/28459180/2642059 其中包含以下代码:
void foo(string&& bar){
string* temp = &bar;
cout << *temp << " @:" << temp << endl;
}
bar 是右值还是左值?
我问是因为我显然不能获取右值的地址,但我可以像这里所做的那样获取右值引用的地址。
如果您可以对右值引用执行任何操作,而您可以对左值引用执行任何操作,那么用“&&”而不是“&”区分两者有什么意义?
【问题讨论】:
-
右值的全部意义在于允许移动语义,它们在大多数情况下(除了它们的类型)只是引用。
-
在您的示例中,您没有移动两次,而是复制了两次,因为
bar是一个左值(它的类型是一个右值,我知道很奇怪)。但是,如果您两次致电std::move,您可能会遇到问题。 -
@JonathanMee 而这种对
bar的双重使用正是为什么bar是一个左值——所以这种双重使用不会给你带来问题。只有当您明确执行此操作时,它才会被视为右值:std::move(bar)。 -
@JonathanMee:你想错了。右值引用被移动进入而不是移出。你知道当你的函数被调用时
bar会被销毁,这就是你得到的。但是,如果您随后在您的内部调用一个函数,除非您明确说明,否则您不会做出该保证。 -
“那我们为什么称它为右值引用呢?” - 因为它是对右值的引用(或者迂腐地,对由右值表达式表示的对象)。这意味着它指的是一个临时变量,或者一个被显式移出的变量(使用
std::move或等效项),因此您的函数可以假设可以从它移出。
标签: c++ c++11 rvalue-reference lvalue rvalue