Я буду смотреть на это с другой точки зрения. В основном я хочу иметь типобезопасный код. NULL
даже лучше, чем nullptr
, потому что 0 имеет тип int, а nullptr
- что угодно.
И инструменты анализа кода stati c будут выдавать информацию, если вы напишите uint i=3U
, тогда еще немного кода, а затем if (i == 0)
. То же самое с NULL
и nullptr
.
Итак, что я использую:
template <typename T>
const T null(void)
{
return static_cast<T>(0);
}
Пример кода
typedef unsigned char uchar;
. . .
uchar someVariable = null<uchar>();
SomeComplexClass *someComplexClass = null<SomeComplexClass *>();
. . .
if (null<SomeComplexClass *>() == someComplexClass)
{
. . .
}
Там сидит обычный программист и говорит. Что это за ерунда?
Но подумайте, мы разработали некоторый код ASIL D. А затем вы рефакторинг вашего кода. И вы случайно измените «SomeComplexClass» на «someOtherComplexClass».
if (null<SomeComplexClass *>() == someOtherComplexClass)
С этим типом безопасного 0 инструменты анализа кода stati c будут выдавать информацию.
Подумайте об этом, когда вы в следующий раз будете водить свой автомобиль с программным обеспечением для руля, тормоза или акселератора ASIL D.
КСТАТИ: также следует избегать auto
везде, где это необходимо возможно в таком коде.