Подтвердить что ты не робот

Определяется ли NULL как nullptr в С++ 11?

Реализации С++ 11 определяют NULL как nullptr?

Будет ли это предписано новым стандартом С++?

4b9b3361

Ответ 1

Из уст лошади

C.3.2.4 Макро NULL [diff.null]

1/ Макрос NULL, определенный в любых <clocale>, <cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime> или <cwchar>, является определенную реализацией константу константы С++ в этом международном стандарте (18.2).

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

Таким образом, его можно определить как nullptr, вам нужно будет проверить документацию вашего компилятора/стандартной библиотеки, чтобы увидеть, что было сделано.

Ответ 2

Нет, NULL все тот же, что и раньше. Слишком много людей использовали NULL-макрос неожиданными способами, переопределяя его до nullptr, сломав много кода.

Чтобы уточнить: люди использовали NULL, например, для многих типов дескрипторов дескрипторов. Если реальный тип за таким типедепом не является указателем, определение NULL как nullptr было бы проблемой. Кроме того, кажется, что некоторые люди действительно использовали NULL для инициализации числовых типов.

По крайней мере, это то, что Microsoft обнаружила, когда они добавили nullptr в MSVC10, и почему они решили сохранить NULL, как всегда. Другие компиляторы могут выбрать другой путь, но я не думаю, что они будут.

Ответ 3

FDIS будущего стандарта С++ 11, интегральное выражение по-прежнему является нулевым указателем постоянная. Макрос NULL все еще реализуется, но должен иметь значение null постоянная указателя. Поэтому на практике это означает, что это хорошо, как 0, или может быть nullptr.

Ваш код, который использовал 0 или NULL, будет работать так же, как и раньше.

Подробнее читайте здесь.