当NULL不能被nullptr替换时

When NULL cannot be replaced by nullptr?

本文关键字:替换 nullptr NULL 不能      更新时间:2023-10-16

我正在重构一些在许多地方使用NULL的旧代码。问题是

nullptr盲目替换所有NULL实例是否安全?

我特别感兴趣的场景是,用nullptr替换NULL可能会导致一些运行时错误(编译时错误也可以),但我想不出任何错误。如果不是,那么用nullptr自动替换NULL是否安全(修复编译时错误(如果有的话))。

如果之前有人问我这个问题,我很抱歉——我找不到,如果你给我指答案,我会删除它!

在实践中,它应该是相当安全的。

但是,从技术上讲,程序的含义可能会发生更改,而不会导致任何编译器错误。考虑以下程序:

void foo(int) { std::cout << "intn"; }
void foo(int*) { std::cout << "int*n"; }
int main() {
    foo(NULL);       // prints 'int'
    foo(nullptr);    // prints 'int*'
    return 0;
}

请注意,当传递NULL时,int和指针之间存在歧义时,指针版本几乎总是所需的——这意味着大多数真实程序一开始就不会有这样的歧义(或者会使用(int*)NULL之类的强制转换来绕过它,在这种情况下,用nullptr替换是完全可以的)。