带有指向指针的自动引用的范围基于循环。

4

关于以下代码,我希望能够有一些澄清。我们有一个指向类的指针数组。接下来,我们使用基于范围的循环遍历该数组。对于这个基于范围的循环,使用了auto&。但是,当我们使用元素a时,可以使用箭头运算符调用函数。

此代码是使用C++11编译的。

// Definition of an array of pointers to some class.
some_class* array[10];

// The array of pointers is set.

// Loop over the array.
for(auto& a : array) 
{
  // Call some function using the arrow operator.
  a->some_func();
}

我的理解是auto&a是一个指针引用,这不是有点过头了吗?使用auto a不会创建指针的副本并占用相同的内存吗?


4
问题是如果你想修改array指针的值,那么你需要使用auto&,如果不想修改它,只需要使用auto来读取a指针所指向的数据。 - rafix07
两者有同样的效果。我不会担心复制与引用指针的问题,因为在这种情况下它们将被优化掉。我更担心普通数组的脆弱性(以及指针数组的双星本质,可能会变得非常危险,接近于三星编程...)。 - Max Langhof
由于引用被实现为指针,因此它们几乎是相同的。 - Michael Chourdakis
谢谢大家的回答!在这种情况下不需要改变指针,因此我们将放弃使用“&”符号。 - Bart
2个回答

4

您的代码编译得很好。

然而,如果您不想更改它,使用引用并没有真正意义。

最佳实践:

  • 如果内容不需要更改,则使用const auto &T。 如果auto类型T很大,则引用很重要。否则,您将复制对象。

  • 如果您想更改正在迭代的容器的内容,则使用auto & T


1

我理解的是,auto & a 是指针的引用,对吗?

是的,你理解的正确。

使用 auto a 不会创建指针的副本并占用相同的内存,对吗?

引用 视为变量的别名,也就是说,将其视为不同的名称。

至于这个 -> 不会创建指针的副本

指针非常轻巧,复制指针相对便宜(这就是视图实现的方式,指向序列的指针)。如果您正在迭代的容器下划线对象是基本类型或某些类型的指针,则 auto 足够。在容器的底层对象是重量级对象的情况下,auto& 是更好的选择(当然,如果您不想修改它,可以添加 const 限定符)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接