'auto'关键字如何知道何时使用const_iterator匹配函数重载?

时间:2014-02-12 12:26:05

标签: c++ c++11 const auto overloading

我理解this question的内容但是在使用函数重载时如何工作?

例如,在std::map中定义了以下方法:

      iterator find (const key_type& k);
const_iterator find (const key_type& k) const;

如何使用auto关键字选择其中一个?以下似乎对我来说似乎不正确:

auto i = mymap.find(key);        //calls the non-const method?
const auto i = mymap.find(key);  //calls the const method?

2 个答案:

答案 0 :(得分:3)

std::map<int, int> mutable_map;
const std::map<int, int> const_map;

mutable_map.find(1); // returns iterator
const_map.find(1);   // returns const_iterator

您不希望从常量map返回常规迭代器,因为这会破坏常量。因此,使find成员函数与常量map合理运行的唯一方法是使const重载返回const_iterator

答案 1 :(得分:1)

在c ++ 14中,您将cbegincend强制执行const_iterator getter。

为了对map的find方法做同样的事情,你需要const_cast但是语法很糟糕或者是一个小帮手。

#include <iostream>
#include <map>

template <typename T> T const &  ccast( T const & v )  { return v; }
template <typename T> T const && ccast( T const && v ) { return v; }

int main() {
    using Map = std::map<int,int>;
    Map map;

    static_assert( std::is_same< decltype(map.find(1)), Map::iterator >::value, " mutable map give mutable iterator" );
    static_assert( std::is_same< decltype(const_cast<Map const&>(map).find(1)), Map::const_iterator >::value, "const map give imutable iterator" );

    static_assert( std::is_same< decltype(ccast(map).find(1)), Map::const_iterator >::value, "const map give imutable iterator" );
    static_assert( std::is_same< decltype(ccast(std::move(map)).find(1)), Map::const_iterator >::value, "const map give imutable iterator" );
}

但是对于一个map,调用mutable find并在赋值时作为const迭代器存储是最简单的,注意它会阻止它之后的迭代

auto const it = map.find(1);
it++ // compilation error
std::for_each( it, end(map), /**/ ); // compilation error too