Почему вызовы конструктора в C ++ и Java требуют явных параметров типа?

C ++ и Java имеют это сходство в том, как они обрабатывают параметрический полиморфизм: оба будут выводить параметры типа для обычных функций или методов, но требуют от программиста явного указания параметров типа при вызове конструктора (хотя это было изменено в Java 7).

Какова техническая причина такого поведения?

редактироватьЯ ошибочно думал, что это относится и к Scala.
Вот пример из Java:

class Foo<T> {
Foo(T x) { }
}

<T> void foo(T x) { }Foo<Integer> f = new Foo(3);
foo(3);

оба они являются законными, но первый создает «сырой тип», а не Foo<Integer>и выполняет непроверенное назначение.

2

Решение

Это потому, что шаблоны C ++ могут быть специализированными.

Это означает, что только потому, что есть основное определение:

template<typename T>
class Foo
{
Foo(T x) { }
};

и ясно int будет принят Foo<int>(int)вполне возможно, что есть также специальное определение

template<>
class Foo<Foobar>
{
Foo(int x) { }
};

который также принимает int параметр.

Добавьте пользовательские преобразования типов в смесь, и вы увидите, что просто невозможно определить параметры типа класса из аргументов функции.

И фактически вывод параметров типа для конструкторов разрешен. Но не вывод параметров шаблона класса. Например, разрешить неявный upcast при создании умного указателя:

template<typename T>
class a_smart_ptr
{
template<typename TOther>
a_smart_ptr(TOther* p) { }
};
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]