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

s3r*_*vac 15 c++ for-loop decltype auto c++14

有没有一种情况时decltype(auto)会比一个更好的选择auto(可能与&,&&或CV限定符)时,使用基于范围的for循环?换句话说,你会写下面的代码吗?

for (decltype(auto) item : range) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

Yak*_*ont 10

decltype(auto)当输入迭代器按值返回时,会生成不同的类型. auto&&创建一个临时的rvalue引用,同时decltype(auto)创建一个本地副本(在C++ 17中它只是命名临时,因为保证的elision更改).

这没有什么区别.在C++ 11/14中,它需要一个移动ctor(在实践中没有被调用,但需要)decltype(auto),但在C++ 17中却没有.在auto&&移动ctor没有被调用,不需要.

另一个区别是类型decltype(item),它始终是引用auto&&,但在临时返回输入的情况下,iteraror decltype(item)是值类型.

就是这样.在实践中,我认为没有理由decltype(auto)结束auto&&.

另外,auto&强制非右值,const auto&强制不可变,并auto强制复制.有理由使用auto&&而不是那些,但这超出了这个问题的范围. decltype(auto)最接近auto&&,所以我比较了这两个.

  • @erip:它确实是一个转发引用 - "当输入迭代器按值返回"时,它会创建一个右值引用.; - ] (2认同)