Строгая типизация nullptr? - PullRequest
11 голосов
/ 21 июня 2011

Я только что прочитал статью о стандарте C ++ 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 шаблонным?

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

1 Ответ

10 голосов
/ 21 июня 2011

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

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

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

А потом вы можете написать

f(null<int*>());
...