【问题标题】:When NULL cannot be replaced by nullptr?什么时候NULL不能用nullptr代替?
【发布时间】:2014-09-16 19:58:20
【问题描述】:

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

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

我对用nullptr 替换NULL 可能会导致一些运行时错误(编译时错误也可以)的情况特别感兴趣,但我想不出任何问题。如果不是,将 NULL 自动替换为 nullptr 是否安全(如果有,则修复编译时错误)。

如果之前有人问过问题,我深表歉意 - 我找不到它,如果你指出答案,我会删除它!

【问题讨论】:

    标签: c++ c++11 null nullptr


    【解决方案1】:

    实际上它应该是相当安全的。

    但是,从技术上讲,您的程序的含义可能会发生变化,而不会导致任何编译器错误。考虑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 替换是非常好的)。

    【讨论】:

    • 值得注意的是,C++11 编译器可以合法地将 NULL 定义为 nullptr,但实际上没有人这样做,因为它会破坏太多现有的代码写一些疯狂的东西,比如char c = NULL; 之类的。
    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 2015-11-24
    • 2021-11-29
    • 2013-12-28
    • 2011-02-05
    • 2021-10-03
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多