Когда NULL не может быть заменен на nullptr?

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

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

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

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

Ответы

Ответ 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 прекрасна).