Следующий код не может быть построен на последних компиляторах (g ++ — 5.3, clang ++ — 3.7).
#include <map>
#include <functional>
#include <experimental/string_view>
void f()
{
using namespace std;
using namespace std::experimental;
map<string, int> m;
string s = "foo";
string_view sv(s);
m.find(sv);
}
Ошибка возвращается clang:
error: no matching member function for call to 'find'
m.find(sv);
~~^~~~
Но не должен find
быть в состоянии использовать сопоставимые типы?
Cppreference упоминает следующую перегрузку:
template< class K > iterator find( const K& x );
Такая же ошибка происходит с boost::string_ref
,
Вам необходимо указать прозрачный компаратор явно (как std::less<>
):
std::map<std::string, int, std::less<>> m;
// ~~~~~~~~~~^
std::map<K,V>
по умолчанию его компаратор std::less<K>
(т.е. непрозрачный один) и с тех пор ([Associative.reqmts] / р13):
Шаблоны функций-членов
find
,count
,lower_bound
,upper_bound
, а такжеequal_range
не должны участвовать в разрешении перегрузки, если только Квалифицированный-идентификаторCompare::is_transparent
допустимо и обозначает тип (14.8.2).
функция-член шаблона find
не является жизнеспособным кандидатом.
Других решений пока нет …