【发布时间】:2016-07-17 12:49:43
【问题描述】:
在使用基于范围的 for 循环时,是否存在decltype(auto) 比 auto(可能带有 &、&& 或 cv 限定符)更好的选择?换句话说,你会写下面的代码吗?
for (decltype(auto) item : range) {
// ...
}
【问题讨论】:
标签: c++ for-loop c++14 auto decltype
在使用基于范围的 for 循环时,是否存在decltype(auto) 比 auto(可能带有 &、&& 或 cv 限定符)更好的选择?换句话说,你会写下面的代码吗?
for (decltype(auto) item : range) {
// ...
}
【问题讨论】:
标签: c++ for-loop c++14 auto decltype
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&&,所以我比较了这两个。
【讨论】:
auto&& 是右值引用吗?我认为这是一个通用/转发参考。不声称你错了——只是想学习。 :)
【讨论】: