微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

for( auto && v : arr ) 不会破坏数组的内容吗?

如何解决for( auto && v : arr ) 不会破坏数组的内容吗?

these questions (also here) 中,建议编写如下代码

for( auto&& v : arr )

但是将数据从 arr 移动到 v 不会破坏数组 arr 吗?这种风格的循环怎么可能安全?

解决方法

首先,auto&& 不是右值引用。它被称为转发引用,它可以是左值引用或右值引用,具体取决于初始值设定项是左值还是右值。

在这种情况下,arr 是一个命名对象,因此在这种情况下,auto&& 实际上与 auto& 相同。

让我们假设 arr 是一个右值而 auto&& 实际上是一个右值引用,您仍然不必担心。引用只是源对象的别名,它实际上对源对象没有任何作用。因为没有移动操作发生,所以不会发生移动。您所做的只是引用元素。你需要像

这样的循环代码
something = std::move(v); // move is required here,even though v is an rvalue reference
                          // because since it has a name,it is an lvalue

为了移动 v 所指的内容。


在循环中,最大的问题是您可以更改存储在 arr 中的值,因为 varr 具有非常量访问权限。使用

for (const auto& v : arr)

允许您仍然接受左值和右值,但也不允许您修改元素。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?