Недавно начал изучать с++. И в процессе возник вопрос, а именно о том чем nullptr отличается от NULL?
(К "динамической памяти" все это не имеет никакого прямого отношения.)
nullptr совсем не обязательно "отличается" от NULL. В современном С++, начиная с C++11, макро NULL может быть определено именно как nullptr.
"Классический" NULL представляет собой целочисленное константное выражение1 со значением 0, т.е. может использоваться не только в указательных, но также и в арифметических контекстах (в том числе - по ошибке). nullptr не приводим к целому типу и в арифметических контекстах использован быть не может2.
Возможность использования "классического" NULL в указательных контекстах базируется на том, что целочисленное константное значение 0 неявно приводимо к указательному типу. Однако такая неявная приводимость не имеет места в контексте аргументов шаблона. Т.е. NULL не может выступать в качестве null-pointer constant в списке аргументов шаблона
template <void *p> struct S {};
int main()
{
S<NULL> s1; // Ошибка!
S<(void *) NULL> s2; // OK
S<nullptr> s3; // OK
}
nullptr свободен от этого недостатка.
1 - в современном С++ (с момента появления nullptr), NULL должен быть определен как целочисленный литерал со значением 0. Произвольное целочисленное константное выражение со значением 0 больше не может выступать в роли null-pointer constant. Также в роли null-pointer constant больше не может выступать false и \0.
2 - кроме возможности приведения к bool.
NULL это дефайн на 0 типа int. nullptr имеет тип указателя, что очень важно в некоторых моментах. Очень подробно эту тему рассматривает Мэйерс в своей книге
Effective Modern C++, очень рекомендую вам её к прочтению.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей