Рассмотрим следующий класс:
template<typename T1, typename T2>
class Pair
{
public:
T1 First;
T2 Second;
Pair(const T1 &First, const T2 &Second) : First(First), Second(Second) { }
}
В С++ не допускается следующее:
auto p = Pair(10, 10);
Почему это не разрешено? типы могут быть полностью определены из вызова конструктора.
Я знаю, что для этого есть обходной путь:
template<typename T1, typename T2>
Pair<T1, T2> MakePair(const T1 &First, const T2 &Second)
{
return Pair<T1, T2>(First, Second);
}
Но зачем это нужно? Почему компилятор просто не определяет тип из аргументов так же, как из шаблона функции? Вы можете сказать это, потому что стандарт не позволяет этого, поэтому почему стандарт не позволяет это?
Edit:
Для тех, кто говорит, что это пример, почему это не должно быть разрешено:
template<typename T1, typename T2>
class Pair
{
public:
T1 First;
T2 Second;
Pair(const T1 &First, const T2 &Second) : First(First), Second(Second) { }
Pair(const T2 &Second, const T1 &First) : First(First), Second(Second) { }
};
auto p = Pair(10,1.0);
Я могу сделать именно это с перегрузкой шаблонов функций:
template<typename T1, typename T2>
Pair<T1, T2> MakePair(const T1 &First, const T2 &Second)
{
return Pair<T1, T2>(First, Second);
}
template<typename T1, typename T2>
Pair<T1, T2> MakePair(const T2 &Second, const T1 &First)
{
return Pair<T1, T2>(First, Second);
}
Почему это разрешено для функций, но не для классов?