Потихоньку трогаю рейнджи, и то ли я прогулял что-то, то ли просто не понял. Почему здесь неоднозначный вызов?
#include <ranges>
#include <utility>
class Ustring {
unsigned char m_markup_state;
friend void swap(Ustring &l, Ustring &r);
};
void swap(Ustring &l, Ustring &r)
{
//using std::ranges::swap; // ok
//using namespace std; // ok
using namespace std::ranges;
swap(l.m_markup_state, r.m_markup_state); // ambiguous call here
}
int main() {
}
$ g++ 1.cpp -std=c++20
1.cpp:14:9: error: reference to ‘swap’ is ambiguous
...concepts:229:43: note: candidates are: ‘constexpr const std::ranges::__cust_swap::_Swap std::ranges::__cust::swap’
1.cpp:9:6: note: ‘void swap(Ustring&, Ustring&)’
Если использовать по старинке std’шный swap() через using namespace std - то неоднозначностей нет. Можно заставить работать и рейнджи через using std::ranges::swap вместо using namespace, но я не понимаю почему оно вот так вот работает, как swap функция для какого-то там Ustring вообще может быть годна для unsigned char?