#include <iostream>
class Foo { };
Foo createFoo() { return Foo(); }
void bar(Foo &&) { std::cout << "in bar(Foo &&)\n"; }
void bar(Foo const &) { std::cout << "in bar(Foo const &)\n"; }
void baz(Foo &&f) {
std::cout << "in baz, ";
bar(f);
// bar(std::move(f));
}
int main()
{
baz(createFoo());
return 0;
}
我的预期输出为:in baz, in bar(Foo &&)
,但我得到了:in baz, in bar(Foo const &)
。如果我将调用切换到bar
(请参阅注释),我会得到预期的输出,但这对我来说似乎不对。如果没有我将bar(Foo &&)
转换为Foo&&
,编译器无法调用Foo&&
吗?
提前致谢!
答案 0 :(得分:13)
在baz(Foo&& f)
内,f
是左值。因此,要将其作为右值参考传递给bar
,您必须将其转换为右值。您可以使用static_cast<Foo&&>(f)
或std::move(f)
。
这是为了避免在同一功能中多次意外移动物体,例如在bar(f)
内多次调用baz
。
答案 1 :(得分:5)
简而言之,规则是命名的右值引用是左值。这是为了防止自动移出您稍后需要使用的命名变量。相比之下,未命名的临时工具永远不能再次使用,因此可以自动移动。
我发现这个系列http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/非常有用,即使它有点老了。