Open
Description
今天刚开始看这本书。第 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
Labels
No labels