Skip to content

可否像维基百科一样引入争议性内容出处。 #301

Open
@mobs001

Description

@mobs001

今天刚开始看这本书。第 2 章 语言可用性的强化,2.1 里写 nullptr ,描述为NULL具有很奇怪的简单的逻辑设计失误, 这个理由很反直觉,按理说 处理关键词 单纯是编译器的设计,如果不是为了兼容性,NULL在编译器层面很好处理, 我简单查了一下,网上更多的说法是 C++ 从前是为了保持了 C的兼容性 保持了 NULL的一致性,既然保持兼容性那NULL必然是保持一致的弱类型。 然后 后来权衡下引入了安全的类型nullptr, NULL作为遗留性继续兼容C。

感觉这就是单纯的决心增加类型安全性nullptr, 而不是在这点上保持与旧的C一致性的的选择问题。 和逻辑完全无关。 然后我又查了下后来的C23也开始增加了nullptr类型。不过并未进一步查询是否一定的原因是为了增加两种语言的兼容性。

文中举例的代码,在msvc下以cxx_std_20 编译 是可以通过的

#include <iostream>
#include <type_traits>

void foo(char *);
void foo(int);

int main() {
    if (std::is_same<decltype(NULL), decltype(0)>::value)
        std::cout << "NULL == 0" << std::endl;
    if (std::is_same<decltype(NULL), decltype((void*)0)>::value)
        std::cout << "NULL == (void *)0" << std::endl;
    if (std::is_same<decltype(NULL), std::nullptr_t>::value)
        std::cout << "NULL == nullptr" << std::endl;

    foo(0);          // 调用 foo(int)
   foo(NULL);    // !在msvc下面能通过编译
    foo(nullptr);    // 调用 foo(char*)
    return 0;
}

void foo(char *) {
    std::cout << "foo(char*) is called" << std::endl;
}
void foo(int i) {
    std::cout << "foo(int) is called" << std::endl;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions