右值参考被视为左值?
我发布了这个答案: 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