На самом деле это общий вопрос о дизайне интерфейса, но мне проще взять std::pair
в качестве примера:
template <class T1, class T2>
struct pair {
...
pair(const T1& x, const T2& y);
template<class U, class V> pair(U&& x, V&& y);
...
};
Итак, мы можем видеть, что есть две перегрузки, которые принимают два аргумента для инициализации двух членов пары. Мой вопрос: в чем преимущество первого, а второго? Существуют ли какие-либо типы аргументов, которые могут быть переданы только первой, но не второй?
(Позвольте просто отложить рассмотрение стандартной библиотеки для обратной совместимости на некоторое время и обсудить дизайн интерфейса как общий вопрос.)