Определяется ли NULL как nullptr в C++11?
Будет ли реализация C++11 определять NULL
как nullptr
?
Будет ли это предписано новым стандартом C++?
3 ответа
Изо рта лошади
C.3.2.4 Макрос NULL [diff.null]
1 / Макрос NULL, определенный в любом из
<clocale>
,<cstddef>
,<cstdio>
,<cstdlib>
,<cstring>
,<ctime>
, или же<cwchar>
в этом международном стандарте (18.2) - константа нулевого указателя C++, определяемая реализацией.
Каждая реализация должна предоставить свое собственное определение, gcc, если я правильно помню, определяет его __nullptr
для которого он имеет специальные проверки (например, проверяет, что он не используется в арифметических контекстах).
Так что это можно определить как nullptr
, вам придется проверить документацию вашего компилятора / стандартной библиотеки, чтобы увидеть, что было сделано.
Нет, NULL все тот же, что и раньше. Слишком много людей использовали макрос NULL удивительным образом, переопределение его для nullptr привело бы к поломке большого количества кода.
Чтобы уточнить: люди использовали NULL, например, для многих типов дескрипторов typedef. Если реальный тип, стоящий за таким typedef, не является указателем, определение NULL как nullptr было бы проблемой. Кроме того, кажется, что некоторые люди действительно использовали NULL для инициализации числовых типов.
По крайней мере, это то, что Microsoft обнаружила, когда они добавили nullptr в MSVC10, и почему они решили оставить NULL как обычно. Другие компиляторы могут выбрать другой путь, но я не думаю, что они будут.
FDIS будущего стандарта C++11, интегральное выражение все еще является константой нулевого указателя. Макрос NULL все еще определяется реализацией, но должен быть константой нулевого указателя. Таким образом, на практике это означает, что он равен 0 или может иметь значение nullptr.
Ваш код, который использовал 0 или NULL, будет работать так же, как и раньше.
Читайте подробности здесь.
NULL происходит от C, поэтому его определение должно быть совместимо как с C, так и с C++. Таким образом, это не может быть nullptr, потому что это ключевое слово C++, а не C, если оно не определено по-другому для C и C++ (мы можем использовать #ifdef __cplusplus, чтобы различать их). Таким образом, NULL обычно определяется как специфичный для какого-то компилятора, например __nullptr в gcc, или просто ((void*)0).