Читаю Мейерса, возник базовый вопрос, который наверное и задать стыдно. Но тем не менее. Не совсем понимаю, что за типы у 0 и NULL. Почему в коде ниже не компилируются закомментированные строки?
http://cpp.sh/5nl7o
#include <iostream>
#include <string>
int f1(int* p)
{
if (p == nullptr) return -1;
else return *p;
}
template<typename funcPtr, typename paramPtr>
decltype(auto) runFunc(funcPtr f, paramPtr p)
{
return (*f)(p);
}
int main()
{
std::cout<<"Template:"<<std::endl;
//std::cout<<runFunc(&f1, 0)<<std::endl; // Doesn't compile
//std::cout<<runFunc(&f1, NULL)<<std::endl; // Doesn't compile
std::cout<<runFunc(&f1, nullptr)<<std::endl;
std::cout<<"No template:"<<std::endl;
std::cout<<f1(0)<<std::endl;
std::cout<<f1((int)0)<<std::endl;
std::cout<<f1(NULL)<<std::endl;
std::cout<<f1((int)NULL)<<std::endl;
std::cout<<f1(nullptr)<<std::endl;
}
Выходит, просто 0 или NULL компилятор может сконверитировать в указатель; (int)0 и (int)NULL тоже может. Но если 0 или NULL передаются как параметр функции типа int, то компилятор уже не может превратить их в указатель? В чём разница?