4

我有一堂课Foo

我想要一个函数,TakeFoo它接受一个Foo对象并调用它的方法。这是我开始的:

void TakeFoo (const Foo&);

但是,我还需要能够在其上调用非常量方法。所以我把它改成这样:

void TakeFoo (Foo&);

但是,当我尝试将临时传递给它时,这会导致警告。所以我创建了一个重载:

void TakeFoo (Foo&&);

但是,我想重用代码,所以TakeFoo(Foo&&)基本上是这样做的:

void TakeFoo (Foo&& FooBar)
{
    TakeFoo(FooBar);
}

为什么这也不会引起警告,因为我仍在对临时对象进行非常量引用?

4

1 回答 1

7

为什么这也不会引起警告,因为我仍在对临时对象进行非常量引用?

它不会引起警告,因为FooBar它是一个左值。

尽管它所绑定的对象是临时对象,并且虽然 的类型FooBar“rvalue-reference to Foo”,但命名变量的值类别左值- 给某个东西一个名称允许该东西在您的程序中被重复引用(其中或多或少是左值用于建模的想法)。

由于左值引用可以绑定到标准 C++ 中的左值,因此您不会从编译器收到任何警告。

于 2013-06-19T18:04:06.873 回答