NULL vs nullptr (Почему он был заменен?)

Я знаю, что в С++ 0x или NULL был заменен на nullptr в приложениях на основе указателей. Мне просто интересно узнать, почему они сделали эту замену?

В каком сценарии используется nullptr над NULL полезным при работе с указателями?

Ответ 1

nullptr всегда является типом указателя. 0 (иначе C NULL перешел на С++) может вызвать неоднозначность в перегруженном разрешении функций, среди прочего:

f(int);
f(foo *);

Ответ 2

Вы можете найти хорошее объяснение, почему его заменили, прочитав Имя нулевого указателя: nullptr, чтобы процитировать документ:

Эта проблема относится к следующим категориям:

  • Улучшите поддержку для создания библиотек, предоставив пользователям возможность писать менее двусмысленный код, чтобы разработчикам библиотек больше не нужно было беспокоиться о перегрузке интегральных и указательных типов.

  • Улучшите поддержку универсального программирования, упростив выражение как целого числа 0, так и nullptr однозначно.

  • Сделать С++ проще для обучения и изучения.

Ответ 3

Вот формулировки Бьярна Страуступа,

В С++ определение NULL равно 0, поэтому существует только эстетическая разница. Я предпочитаю избегать макросов, поэтому я использую 0. Другая проблема с NULL заключается в том, что люди иногда ошибочно полагают, что она отличается от 0 и/или не целой. В предстандартном коде NULL был/иногда определен чем-то неподходящим, и поэтому его/его следует избегать. Это менее распространено в наши дни.

Если вам нужно называть нулевой указатель, назовите его nullptr; то, что он вызывается в С++ 11. Тогда "nullptr" будет ключевым словом.

Ответ 4

Одна из причин: буква 0 имеет плохую тенденцию приобретать тип int, например. в идеальном переадресации аргументов или в целом в качестве аргумента с шаблоном типа.

Другая причина: читаемость и ясность кода.