Я не читал реальную спецификацию по этому вопросу, но я уверен, что указанный вами вызов был бы неоднозначным без приведения, поскольку нулевой указатель может быть преобразован в указатель любого типа.Поэтому приведение должно быть необходимым.
И нет, к сожалению, nullptr
не является шаблоном.Мне действительно нравится эта идея, поэтому вы можете написать такую функцию:
template <typename PtrType> PtrType null() {
return static_cast<PtrType>(nullptr);
}
А потом вы можете написать
f(null<int*>());