当使用基于范围的for循环时,decltype(auto)
比auto
(可能包含&
,&&
或cv限定符)更好的选择是否存在? ?换句话说,你会写下面的代码吗?
for (decltype(auto) item : range) {
// ...
}
答案 0 :(得分:10)
decltype(auto)
生成不同的类型。 auto&&
创建一个对临时值的右值引用,而decltype(auto)
创建一个本地副本(在C ++ 17中,它只是因为保证的省略更改而将临时名称命名)。
这没什么区别。在C ++ 11/14中,它需要在decltype(auto)
情况下移动ctor(在实践中不需要调用,但需要),但在C ++ 17中则不需要。在auto&&
中,移动ctor未被调用而不是必需的。
另一个区别是decltype(item)
的类型,它始终是auto&&
的引用,但在临时返回输入的情况下,iteraror decltype(item)
是值类型。
就是这样。在实践中,我认为没有理由decltype(auto)
超过auto&&
。
另外,auto&
强制非右值,const auto&
强制不可变,auto
强制复制。有理由使用auto&&
代替那些,但这超出了本问题的范围。 decltype(auto)
最接近auto&&
,因此我对这两者进行了比较。
答案 1 :(得分:3)