Почему аргументы конструктора шаблона класса не определяются автоматически?

Рассмотрим следующий класс:

template<typename T1, typename T2>
class Pair
{
     public:
         T1 First;
         T2 Second;
         Pair(const T1 &First, const T2 &Second) : First(First), Second(Second) { }
}

Следующее не разрешено в C ++:

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);
}

Но зачем это нужно? Почему компилятор просто не определяет тип из аргументов, как это делает из шаблона функции? Вы можете сказать, что это потому, что стандарт не допускает этого, так почему же стандарт не допускает этого?

Изменить:
Для тех, кто говорит, что это пример, почему этого не должно быть разрешено:

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);
}

Почему это разрешено для функций, но не для классов?

13
задан Dani 27 October 2011 в 19:51
поделиться