右值参考被视为左值?

我发布了这个答案: https : //stackoverflow.com/a/28459180/2642059其中包含以下代码:

void foo(string&& bar){ string* temp = &bar; cout << *temp << " @:" << temp << endl; } 

是一个右值还是左值?

我问,因为我显然不能接受一个右值的地址,但我可以像在这里所做的那样,使用右值引用的地址。

如果你可以对右值引用进行右值引用的任何操作,那么使用“&&”而不是“&”区分两者的意义何在?

是一个右值还是左值?

这个问题自己回答。 无论什么名字都是一个左值(1) 。 所以bar是一个左值。 它的types是“右值引用到string ”,但它是这种types的左值。

如果你想把它作为一个右值,你需要对它应用std::move()


如果你可以对右值引用进行右值引用的任何操作,那么使用“&&”而不是“&”区分两者的意义何在?

这取决于你的“执行操作”的定义。 一个左值引用和一个(命名的)右值引用在你如何在expression式中使用它们几乎是一样的,但是它们可以绑定到它们上。 左值可以绑定到左值引用,右值可以绑定到左值引用(和任何可以绑定到左值引用const )。 也就是说,你不能将右值绑定到左值引用,反之亦然。

让我们来讨论一下右值引用types的函数参数(比如你的bar )。 重要的一点不是bar是什么,而是你知道bar所指的价值。 因为bar是一个右值引用,所以你肯定知道绑定它的东西是一个右值。 这意味着在完整expression式结束时它必然会被销毁,并且可以安全地将其视为右值(通过窃取其资源等)。

如果你不是那个直接去做这个的人,而只是想通过bar ,你有两个select:要么你已经做好了bar ,然后你应该告诉下一个接受它的人, rvalue-do std::move(bar) 。 或者你需要用bar做更多的事情,所以你不希望有人在你的下面窃取你的资源,所以把它当作一个左值bar

总结一下: 一旦你拥有了它,你所能做的就不一样了。 不同的是可以绑定到参考。


(1)一个很好的经验法则,除了小例外:统计员有名字,但是是右值。 类,名称空间和类模板具有名称,但不是值。

是一个右值还是左值

这是一个左值 ,任何expression式都是一个variables。

如果你可以对右值引用进行右值引用的任何操作,那么使用“&&”而不是“&”区分两者的意义何在?

您只能使用 expression式初始化右值引用。 所以你可以传递一个临时string到你的函数中,但是你不能传递一个stringvariables而不明确地从它移动。 这意味着你的函数可以假设不再需要这个参数,并且可以从中移动。

 std::string variable; foo(variable); // ERROR, can't pass an lvalue foo(std::move(variable)); // OK, can explicitly move foo("Hello"); // OK, can move from a temporary