C++ 初始化nullptr\t时,如何将0与其他整数区分开来?

C++ 初始化nullptr\t时,如何将0与其他整数区分开来?,c++,types,type-conversion,C++,Types,Type Conversion,据我所知,std::nullptr\u 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’

据我所知,
std::nullptr\u 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
}
#包括
int main()
{
std::nullptr_t null1=0;
std::nullptr_t null2=nullptr;
std::nullptr\u t null3=5;//错误:无法在初始化中将“int”转换为“std::nullptr\u t”
}
这是怎么回事?即,如果这些文本不是模板参数,标准库在编译时如何区分
0
5


是否可以创建一个自定义类,在编译时不使用
std::nullptr\u t
而类似地区分其构造函数的参数?

a
nullptr\u t
只能指定隐式转换的值
nullptr
0

根据N4296(第86页):

4.10指针转换

空指针常量是一个整数文本,其值为 或类型为
std::nullptr\u t
的PR值。可以使用空指针常量 转换为指针类型;结果是的空指针值 该类型和对象的其他值不同 指针或函数指针类型。[…]的空指针常量 整型可以转换为
std::nullptr\u t
类型的PR值

可以在< C++ >自己创建一个类似的类型。< /P>

std::nullptr\u t
作为内置类型实现,其独特属性由编译器强制执行


编辑:固定了内置类型的段落。谢谢你,雅克

N3337[conv.ptr]/1:
空指针常量是一个整数类型的整型常量表达式prvalue,其计算结果为 零或类型为
std::nullptr\u t
的PR值。空指针常量可以转换为指针类型;这个 结果是该类型的空指针值,并可与对象指针的所有其他值或 函数指针类型。这种转换称为空指针转换。的两个空指针值 同一类型应比较相同。空指针常量到cv限定类型指针的转换为 单个转换,而不是指针转换后的限定转换序列整数类型的空指针常量可以转换为
std::nullptr\u t

0
是整数类型的空指针常量,因此可以将其转换为
std::nullptr\u t
类型的prvalue
5
不是空指针常量,因此不能为空

如果这些文字不是模板参数,标准库在编译时如何区分0和5

这与标准库毫无关系,
nullptr\u t
是编译器已知的内置类型,显然编译器知道
5
0
之间的区别

是否可以创建一个自定义类,在编译时不使用
std::nullptr\t
来区分其构造函数的参数

一般来说,没有


您可以编写一个类型,该类型可以从
0
初始化,而不是从
5
初始化,方法是将其设置为指针类型的参数,因为
0
是有效的空指针常量,而
5
不是。但是您不能编写一个可以从
3
构造而不是从
5
构造的类型,或者类似的任何东西。

该引用不允许上述转换,因为
std::nullptr\u t
不是指针类型。@TartanLlama从引用的段落中添加了一句额外的句子。这个问题基本上是:“为什么
-a
b-a
起作用,而
/a
b/a
起作用时不起作用?”。因为标记的意义取决于它的上下文。