2014-09-16 2 views
16

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

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

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

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

ответ

21

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

Но, технически, это is возможно, что значение вашей программы изменяется, не вызывая ошибок компилятора. Рассмотрим following program:

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

+3

Стоит отметить, что компилятор C++ 11 * может * юридически определять «NULL» как «nullptr», хотя на практике никто не делает этого, потому что он сломает слишком много существующего кода с людьми, которые пишут сумасшедшие вещи, такие как 'char c = NULL; 'и тому подобное. –

Смежные вопросы