我有一个班级Foo
。
我想要一个函数TakeFoo
,它接受一个Foo
对象并在其上调用方法。这就是我的开始:
void TakeFoo (const Foo&);
但是,我还需要能够在其上调用非const方法。所以我把它改成了这个:
void TakeFoo (Foo&);
但是,当我尝试将临时文件传递给它时会引发警告。所以我创建了一个重载:
void TakeFoo (Foo&&);
但是,我想重用代码,因此TakeFoo(Foo&&)
基本上是这样做的:
void TakeFoo (Foo&& FooBar)
{
TakeFoo(FooBar);
}
为什么这也没有引起警告,因为我仍在对一个临时的非const引用?
答案 0 :(得分:7)
为什么这也没有引起警告,因为我仍在对一个临时的非const引用?
它没有引起警告,因为FooBar
是左值。
虽然绑定的对象是临时的,虽然FooBar
的类型是“Foo
的rvalue-reference”,但值类别命名变量是 lvalue - 给出一个名称允许在程序中重复引用该东西的东西(这或多或少是lvalues用于建模的想法)。
由于左值引用可以绑定到标准C ++中的左值,因此您不会收到编译器的任何警告。