我理解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?
答案 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中,您将cbegin和cend强制执行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