带指针的引用和右引用 我在C++设计模式教程中找到了以下代码: vector<Object*> objects; void foo() override { cout << "Group contains:\n"; for (auto&& o : objects) o->foo(); }

带指针的引用和右引用 我在C++设计模式教程中找到了以下代码: vector<Object*> objects; void foo() override { cout << "Group contains:\n"; for (auto&& o : objects) o->foo(); },c++,c++11,foreach,reference,auto,C++,C++11,Foreach,Reference,Auto,此外,如果使用auto&o,会发生什么情况?所有这些可能性都正确编译并产生正确的结果…for(auto o:objects)将创建提到的副本,因为它使用值语义来获取对象。您可以使用auto&o来避免这种情况 但是,如果取消对迭代器的引用(由的范围自动完成)返回一些代理对象(通常:按值返回),这将不起作用。一个例子可能是使用 那么,这将不起作用: std::vector<bool> vec; for (auto& v : vec) // fail { ... } std:

此外,如果使用auto&o,会发生什么情况?所有这些可能性都正确编译并产生正确的结果…

for(auto o:objects)
将创建提到的副本,因为它使用值语义来获取对象。您可以使用
auto&o
来避免这种情况

但是,如果取消对迭代器的引用(由的范围自动完成)返回一些代理对象(通常:按值返回),这将不起作用。一个例子可能是使用

那么,这将不起作用:

std::vector<bool> vec;
for (auto& v : vec) // fail
{
  ...
}
std::向量向量向量机;
for(auto&v:vec)//失败
{
...
}
因为不能将右值引用绑定到非常量左值引用。因此,您可以使用universal reference来解决此问题:

std::vector<bool> vec;
for (auto&& v : vec) // ok
{
  ...
}
std::向量向量向量机;
for(auto&&v:vec)//确定
{
...
}
在您发布的示例中,
vector
持有指向对象的指针,因此没有实际区别-如果您不想修改内容(因此,不需要通过引用获取指针),使用值是完全正确的,因为复制指针只会导致复制其值,而不是复制指针对象。因此没有真正的收益。使用右值引用也没有什么好处,除了它正确地传播对象
const
-ness,并且如果您更改元素向量存储的类型,它会更加防弹(无论
*iterator
是否返回const/非const左值/rvalue引用,它仍然会为您提供正确的类型)


更新:事实上,我刚刚发现了类似的问题,答案与我提供的示例几乎相同

for(auto o:objects)
将创建提到的副本,因为它使用值语义来获取对象。您可以使用
auto&o
来避免这种情况

但是,如果取消对迭代器的引用(由的范围自动完成)返回一些代理对象(通常:按值返回),这将不起作用。一个例子可能是使用

那么,这将不起作用:

std::vector<bool> vec;
for (auto& v : vec) // fail
{
  ...
}
std::向量向量向量机;
for(auto&v:vec)//失败
{
...
}
因为不能将右值引用绑定到非常量左值引用。因此,您可以使用universal reference来解决此问题:

std::vector<bool> vec;
for (auto&& v : vec) // ok
{
  ...
}
std::向量向量向量机;
for(auto&&v:vec)//确定
{
...
}
在您发布的示例中,
vector
持有指向对象的指针,因此没有实际区别-如果您不想修改内容(因此,不需要通过引用获取指针),使用值是完全正确的,因为复制指针只会导致复制其值,而不是复制指针对象。因此没有真正的收益。使用右值引用也没有什么好处,除了它正确地传播对象
const
-ness,并且如果您更改元素向量存储的类型,它会更加防弹(无论
*iterator
是否返回const/非const左值/rvalue引用,它仍然会为您提供正确的类型)


更新:事实上,我刚刚发现了类似的问题,答案与我提供的示例几乎相同

在循环中使用正确引用的目的是什么

在基于范围的循环中使用
auto&&
作为通用参考有几个优点:

  • const
    到迭代元素的传播

  • 更好的可维护性:如果您更改容器所包含的元素,它将做正确的事情。如果您更改为
    std::vector
    ,它仍然会得到一个引用而不是一个副本(如果您使用
    for(auto o:objects)

关于
auto
以及在何处使用它,人们已经说了很多。我特别喜欢赫伯·萨特(Herb Sutter)的作品,他在其中提倡使用它,并给出了一些很好的指导

在循环中使用正确引用的目的是什么

在基于范围的循环中使用
auto&&
作为通用参考有几个优点:

  • const
    到迭代元素的传播

  • 更好的可维护性:如果您更改了容器包含的元素,它会做正确的事情。如果您更改为
    std::vector
    ,它仍然会得到一个引用而不是副本(如果您使用
    for(auto o:objects)


关于
auto
和在何处使用它,人们已经说了很多。我特别喜欢赫伯·萨特(Herb Sutter)在其中提倡使用它,并给出了一些很好的指导。

那么,为什么
auto&&
向量对象一起使用;
?这并不能回答问题。因为向量是指针向量,所以取copies在我看来很好。@对于指针来说很奇怪,使用rv ref没有任何优势,除了代码更加防弹,并且如果更改,它将正确地根据对象的类型进行调整。更新。我真的很好奇到底什么值得否决。仍然不清楚在哪种情况下它会有用,以及在使用指针时它是否有真正的优势……但是我想我不必太在意它:)@giuseppe IMHO最好明确指定如何引用迭代对象。使用const/non-const或ref/value取决于您希望获得的访问类型。使用右值引用仅在临时对象的情况下才有意义,如我提供的示例中所示。否则,不清楚目的是什么,因为没有技术上的理由这样做。那么,为什么
auto&&
向量对象一起使用;
?这并不能回答这个问题。因为向量是指针的向量,所以在我看来,复制看起来很好。@对于指针来说,使用rv ref没有任何好处,只是代码更为防弹,并且可以正确地调整自身以适应对象的类型,如果更改。更新。我真的