基于范围的 for 循环与 decltype(auto)

Range-based for loop with decltype(auto)

本文关键字:循环 decltype auto for 范围 于范围      更新时间:2023-10-16
在使用

基于范围的 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 循环中使用通用引用的更多详细信息。