关于r值参考的困惑

Ste*_*ell 4 c++ rvalue-reference c++11

#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;
}
Run Code Online (Sandbox Code Playgroud)

我的预期输出是:in baz, in bar(Foo &&),但我得到了:in baz, in bar(Foo const &).如果我将调用切换到bar(请参阅注释),我会得到预期的输出,但这对我来说似乎不对.是否有一些原因编译器无法在bar(Foo &&)没有转换Foo&&为a的情况下调用Foo&&

提前致谢!

Ant*_*ams 13

里面baz(Foo&& f),f是一个左值.因此,要将其bar作为右值引用传递给您,必须将其转换为右值.你可以用a static_cast<Foo&&>(f)或者用std::move(f).

这是为了避免在同一功能中多次意外移动物体,例如多次调用bar(f)内部baz.

  • 请_not_与`static_cast`! (3认同)
  • @AnthonyWilliams:严格来说,`f`是一个右值引用和一个左值.`static_cast <Foo &&>(f)`的结果也是一个右值引用,但是是一个xvalue(一种rvalue).即你使用static_cast从类型T转换为自身,但作为副作用,你正在改变l/r值.否则你的解释非常好. (2认同)