In C++ 14 haben Sie cbegin und cend, um einen Const_iterator Getter zu erzwingen.
Um dasselbe mit den Suchmethoden der Karte zu tun, brauchen Sie const_cast, aber die Syntax ist schrecklich oder ein kleiner Helfer.
#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");
}
Aber für eine Karte, die wandelbar Fund aufrufen und speichern als const iterator bei der Zuordnung der einfachste ist zu beachten, dass es von ihm Iterieren verhindern wird nach diesem
auto const it = map.find(1);
it++ // compilation error
std::for_each(it, end(map), /**/); // compilation error too
Das ist zu spät ist, die LHS ist nicht an der Überladungsauflösung beteiligt. –
@MarcGlisse Willst du damit sagen, dass es nicht funktioniert mit 'const_iterator i = mymap.find (key);'? Also, was ist der Sinn dieser Funktionsüberlastung? – DarioP
'auto it = as_const (Karte) .find (...);' – Xeo