Сильная типизация 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*>());