关于r值参考的困惑

时间:2012-05-15 15:41:52

标签: c++ c++11 rvalue-reference

#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&&吗?

提前致谢!

2 个答案:

答案 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/非常有用,即使它有点老了。