我在 C++ 设计模式教程中找到了以下代码:
vector<Object*> objects;
void foo() override
{
cout << "Group contains:\n";
for (auto&& o : objects)
o->foo();
}
在循环中使用右引用的目的是什么?我知道它用于避免复制临时对象并实现移动语义,但我看不出它在这种情况下如何应用以及为什么不使用简单的
for (auto o : objects)
o->foo();
此外,如果使用 auto&o 会发生什么情况?所有这些可能性都可以正确编译并产生正确的结果...
for (auto o : objects)
将创建提到的拷贝,因为它使用值语义来获取对象。你可以使用 auto& o
避免这种情况。
但是,如果取消引用迭代器(由范围 for
自动完成)返回某个代理对象(通常:按值返回),这将不起作用。一个例子可能是 std::vector<bool>
使用 such "proxy reference" .
那么,这将不起作用:
std::vector<bool> vec;
for (auto& v : vec) // fail
{
...
}
因为您不能将右值引用绑定(bind)到非常量左值引用。因此,您可以使用通用引用来解决此问题:
std::vector<bool> vec;
for (auto&& v : vec) // ok
{
...
}
在您发布的示例中,vector
保存指向对象的指针,因此没有实际区别 - 如果您不想修改内容(因此不需要通过引用获取指针),使用 value 完全没问题,因为复制指针只会导致其值被复制,而不是指针对象。所以没有真正的收获。使用右值引用也没有任何优势,除了它可以正确传播对象 const
。 -ness 并且如果您更改元素 vector 存储的类型则更加防弹(它仍然会为您提供正确的类型,无论 *iterator
是否返回 const/non-const 左值/右值引用)。
更新:实际上,我刚刚发现了类似的问题,该问题的回答几乎与我提供的示例相同。 Link .