Когда NULL нельзя заменить на nullptr?

Я рефакторинг некоторого старого кода, который использует NULL во многих местах. Вопрос в том

Безопасно ли слепо заменять все экземпляры NULL на nullptr?

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

Прошу прощения, если вопрос был задан ранее - я не смог его найти, я удалю его, если вы укажете мне на ответ!


person Ilya Kobelevskiy    schedule 16.09.2014    source источник


Ответы (1)


На практике это должно быть достаточно безопасно.

Но технически возможно изменение смысла вашей программы без каких-либо ошибок компилятора. Рассмотрим следующую программу:

void foo(int) { std::cout << "int\n"; }
void foo(int*) { std::cout << "int*\n"; }

int main() {
    foo(NULL);       // prints 'int'
    foo(nullptr);    // prints 'int*'
    return 0;
}

Обратите внимание, что когда возникает неоднозначность между int и указателем при передаче NULL, версия указателя — это то, что почти всегда желательно — это означает, что в большинстве реальных программ изначально не будет такой неоднозначности (или будут использоваться приведения вроде (int*)NULL чтобы обойти это, и в этом случае замена на nullptr вполне уместна).

person Cameron    schedule 16.09.2014
comment
Стоит отметить, что компилятор C++11 мог бы юридически определить NULL как nullptr, хотя на практике никто этого не делает, потому что это нарушило бы слишком много существующего кода, когда люди пишут сумасшедшие вещи, такие как char c = NULL; и тому подобное. - person T.C.; 17.09.2014