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

时间:2016-07-17 12:49:43

标签: c++ for-loop c++14 auto decltype

当使用基于范围的for循环时,decltype(auto)auto(可能包含&&&或cv限定符)更好的选择是否存在? ?换句话说,你会写下面的代码吗?

for (decltype(auto) item : range) {
    // ...
}

2 个答案:

答案 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)

如上所述here

  

decltype(auto)主要用于推导转发函数和类似包装器的返回类型

     

[...]

     

虽然它可以用来声明局部变量,但这样做可能只是一个反模式,因为局部变量的引用不应该依赖于初始化表达式

也就是说,在基于范围的for循环中使用转发参考是可行的方法。
如上所述here

  

安全,事实上,在通用代码中,最好使用演绎来转发参考

我建议在SO上提出this问题,以获取有关在基于范围的for循环中使用通用引用的更多详细信息。