0 vs NULL vs nullptr
От: RiNSpy  
Дата: 01.12.16 11:19
Оценка:
Читаю Мейерса, возник базовый вопрос, который наверное и задать стыдно. Но тем не менее. Не совсем понимаю, что за типы у 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, то компилятор уже не может превратить их в указатель? В чём разница?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.