Сильная типизация nullptr?

Я просто прочитал статью о стандарте С++ 0x: http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/

Он сказал, что nullptr был сильно типизирован, что означает, что его можно отличить от целого числа 0.

f(int);
f(char* p);

f(nullptr); // calls char* version

Это все хорошо, но мне интересно узнать, что стандарт говорит о nullptr с двумя функциями указателя:

f(char* p);
f(int* p);

f(nullptr);

Мне нужно бросить здесь? И есть nullptr templated?

f((int*)(nullptr);
f(static_cast<int*>(nullptr));
f(nullptr<int>);               // I would prefer this

Ответ 1

Я не читал фактическую спецификацию на этом, но я уверен, что указанный вами вызов будет неоднозначным без актера, поскольку нулевой указатель может быть преобразован в указатель любого типа. Поэтому приведение должно быть необходимым.

И нет, к сожалению, nullptr не является шаблоном. Мне действительно нравится эта идея, поэтому вы можете рассмотреть возможность написания такой функции, как эта:

template <typename PtrType> PtrType null() {
     return static_cast<PtrType>(nullptr);
}

И тогда вы могли бы написать

f(null<int*>());