这句话“auto iter = first”发生了什么

时间:2016-08-19 08:36:24

标签: c++ iterator const auto

这句话发生了什么:

auto iter = first;

为什么iter++可以很好地运作,我们都知道,firstconst&

template<typename iteratorT, typename valueT>
iteratorT find(const iteratorT& first, const iteratorT& last,const valueT& value)
{
    auto iter = first;
    while(iter != last && *iter != value) iter++;
    return iter;
}

为什么?

1 个答案:

答案 0 :(得分:5)

这就是使用auto时类型扣除的工作原理,在示例中,您获得了first的副本,并且该副本的类型为iteratorT

您可以改为使用:

  • const iteratorT &iter = first
  • const auto &iter = first(或仅auto &
  • decltype(first) iter = first
  • decltype(auto) iter = first

如果你希望iter成为const引用,那么所有这些都是。

感谢@songyuanyao和@LogicStuff在评论中提出的建议。

还要考虑以下以更干净的方式重现您的问题的示例:

#include <type_traits>

int main() {
    int i = 42;
    const int & j = i;
    auto k = j;

    static_assert(std::is_same<decltype(k), int>::value, "!");
    static_assert(not std::is_same<decltype(k), const int &>::value, "!");
}