基于范围的 for 循环与 decltype(auto)
Range-based for loop with decltype(auto)
基于范围的 for 循环时,是否存在比 decltype(auto)
比 auto
(可能带有 &
、&&
或 cv 限定符)更好的选择?换句话说,你会写以下代码吗?
for (decltype(auto) item : range) {
// ...
}
decltype(auto)
当输入迭代器按值返回时生成不同的类型。 auto&&
创建对临时副本的右值引用,而decltype(auto)
创建本地副本(在 C++17 中,由于保证的省略更改,它只是命名临时副本)。
这没有什么区别。 在 C++11/14 中,它要求在decltype(auto)
情况下移动 ctor(在实践中不调用,但需要),但在 C++17 中不需要。 在auto&&
中,移动 ctor 不是调用的,也不是必需的。
另一个区别是decltype(item)
的类型,它是一个总是带有auto&&
的引用,但在临时返回输入的情况下,迭代器decltype(item)
是一个值类型。
仅此而已。 在实践中,我认为没有理由decltype(auto)
auto&&
.
顺便说一句,auto&
强制非右值,const auto&
强制非可变,auto
强制复制。 有理由使用auto&&
而不是那些,但这超出了这个问题的范围。 decltype(auto)
最接近auto&&
,所以我比较了这两者。
如下所述:
decltype(auto) 主要用于推断转发函数和类似包装器的返回类型
[...]
虽然它可以用来声明局部变量,但这样做可能只是一个反模式,因为局部变量的引用性不应该依赖于初始化表达式。
也就是说,在基于范围的 for 循环中使用转发引用是可行的方法.
如下所述:
使用推导转发引用是安全的,事实上,在通用代码中更可取
我会在 SO 上建议这个问题,以获取有关在基于范围的 for 循环中使用通用引用的更多详细信息。
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 在基于范围的for循环中使用结构化绑定声明
- C++decltype和圆括号-为什么
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 基于范围的 for 循环与 decltype(auto)