当无法使用nullptr替换NULL时?

23

我正在重构一些使用NULL的旧代码。问题是:

是否可以安全地将所有NULL实例盲目替换为nullptr

我特别关注替换NULLnullptr可能会导致某些运行时错误的情况(如果只有编译时错误则可以接受),但我想不出任何情况。如果没有,请只自动将NULL替换为nullptr(同时修复任何编译时错误)。

如果此前已经有人问过类似的问题,我很抱歉 - 我找不到答案,如果您能指出,我会删除这个问题!

1个回答

28

实际上,这应该相当安全。

但是从技术上讲,你的程序的含义可能会发生变化,而不会引起任何编译器错误。请考虑下面的程序

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;
}

请注意,当在传递NULL时,如果int和指针之间存在歧义,则几乎总是希望使用指针版本 - 这意味着大多数真实程序一开始就不会有这样的模糊性(或者将使用诸如(int *)NULL 的转换来解决它,在这种情况下,用nullptr替换完全没问题)。


6
值得注意的是,虽然在实践中没有编译器这样做,因为它会破坏太多现有的代码,例如人们编写像 char c = NULL; 这样的疯狂代码,但 C++11编译器在法律上可以将 NULL 定义为 nullptr - T.C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接