在C中,NULL定义为(void *)0在C++中它是0.为什么会这样?在CI中可以理解,如果NULL不是类型转换,(void *)则编译器可能/可能不会生成警告.除此之外,有什么理由吗?
按照我的理解,std::nullptr_t可以从被初始化nullptr,以及从0.但同时下面的第三次初始化不起作用,尽管5类型如下0:
#include <memory>
int main()
{
std::nullptr_t null1=0;
std::nullptr_t null2=nullptr;
std::nullptr_t null3=5; // error: cannot convert ‘int’ to ‘std::nullptr_t’ in initialization
}
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?即如何在标准库区分0从5在编译的时候,如果这些文字是不是模板参数?
可以创建一个自定义类,它在编译时类似地区分其构造函数的参数,而不是std::nullptr_t用于此吗?
我正在发布一个问题的答案 - 并评论了我想到的,感谢另一张名为金属的海报
C++ 编译器允许这样做:
int *p = 0;但不是这个int *p = 1。是否被0视为特殊号码?
编辑:@DavidHefferman 说Is 0 special? In the context of a pointer, yes it is.- 为什么?