如何解决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
中的值,因为 v
对 arr
具有非常量访问权限。使用
for (const auto& v : arr)
允许您仍然接受左值和右值,但也不允许您修改元素。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。