Точка настройки std: :() вызывает наиболее подходящую перегрузку? - PullRequest
5 голосов
/ 25 февраля 2020

Начиная с C ++ 20, понятие точка настройки введено в [namespace.std] / 7 :

За исключением пространства имен std или в пространстве имен в пространстве имен std, программа может обеспечить перегрузку для любого шаблона библиотечной функции, обозначенного как точка настройки , при условии, что (a) объявление перегрузки зависит по крайней мере от одного определенного пользователем типа и (б) перегрузка отвечает требованиям стандартной библиотеки для точки настройки. [Примечание: это позволяет ( квалифицированный или неквалифицированный) вызов точке настройки для вызова наиболее подходящей перегрузки для заданных аргументов. - конец примечания]

Означает ли часть примечания (обратите внимание на выделенное слово «квалифицированный»), что std::f автоматически вызовет наиболее подходящую перегрузку для f, если std::f является точкой настройки ?

Реальным примером является std::swap, который является назначенной точкой настройки. Означает ли это, что с C ++ 20 мы можем написать std::swap(a, b) напрямую вместо using std::swap; swap(a, b);?

1 Ответ

3 голосов
/ 25 февраля 2020

Реальным примером является std::swap, который является назначенной точкой настройки. Означает ли это, что с C ++ 20 мы можем написать std::swap(a, b) напрямую вместо использования std::swap; swap(a, b);?

Нет. std::swap сама не получила никаких способностей. Это все еще просто шаблон функции, поэтому, если вы вызываете его напрямую, вы ... вызываете его напрямую. Никаких ADL или чего-либо еще.

Смысл этого в том, чтобы сказать , как следует выбирать точек настройки. То есть вы пишете:

namespace N { // not std
    void swap(Foo&, Foo&);
}

Не:

namespace std {
    void swap(N::Foo&, N::Foo&);
}

Ни:

namespace std {
    template <>
    void swap(N::Foo&, N::Foo&);
}

Тем не менее, в C ++ 20 есть много новых вещей, называемых объектами точек настройки , которые вы можете использовать напрямую, чтобы делать подобные вещи. CPO для swap пишется std::ranges::swap (и также есть CPO для всех полезных диапазонов вещей ... ranges::begin, ranges::end, et c.).

...