c++ - 带指针的引用和右引用

标签 c++ c++11 foreach reference auto

<分区>

我在 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 .

关于c++ - 带指针的引用和右引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48786205/

相关文章:

c++ - std::vector::resize(size_type) 是否应该(在 C++11 中)适用于默认的可构造 value_type int[4]?

c++ - 按值或引用抛出异常

VBA 遍历行,使用多个工作表

c++ - 使用VS2015 Express,删除VS2013 Community,无法运行 "MSVCP120d.dll missing"

c++ - 部分模板特化可能不适用于函数,但重载不是同一件事吗?

c++ - 在一次操作中进行多个矩阵-矩阵乘法

c++ - g++ 编译器错误 : couldn't deduce template parameter ‘_Funct’

c++ - 当指定派生类的析构函数时,std::move 不起作用

c++ - this 和成员函数的常量正确性

PHP:如何结合 foreach 和 explode