Rus*_*lan 20 c++ types type-conversion
按照我的理解,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用于此吗?
oo_*_*uel 22
A nullptr_t只能分配值nullptr或0隐式转换.
根据N4296(第86页):
4.10指针转换
甲空指针常数是一个文字整数值为零 或类型的prvalue
std::nullptr_t.空指针常量可以转换为指针类型; 结果是该类型的空指针值,并且可以与对象指针或函数指针类型的每个其他值区分开.[...]整数类型的空指针常量可以转换为类型的prvaluestd::nullptr_t.
您无法自己在C++中创建类似的类型.
std::nullptr_t作为内置类型实现,其不同的属性由编译器强制执行.
编辑:修复了内置类型的段落.谢谢Yakk!
Tar*_*ama 11
N3337 [conv.ptr]/1:空指针常量是整数类型的整数常量表达式prvalue,其计算结果为零或类型的prvaluestd::nullptr_t.空指针常量可以转换为指针类型; 结果是该类型的空指针值,并且可以与对象指针或函数指针类型的每个其他值区分开.这种转换称为空指针转换.相同类型的两个空指针值应相等.将空指针常量转换为指向cv限定类型的指针是单个转换,而不是指针转换的顺序,后跟限定转换.可以将整数类型的空指针常量转换为类型的prvaluestd::nullptr_t.
0是整数类型的空指针常量,因此可以将其转换为类型的prvalue std::nullptr_t.5不是空指针常量,所以它不能.
Jon*_*ely 11
如果这些文字不是模板参数,标准库如何在编译时将0与5区分开来?
这有没有关系,在所有的标准库,nullptr_t是一个内置的编译器知道的类型,显然编译器知道之间的差别5和0
可以创建一个自定义类,它在编译时类似地区分其构造函数的参数,而不是
std::nullptr_t用于此吗?
一般没有.
您可以编写一个可以通过使用指针类型的参数来初始化0而不是来自5的类型,因为它0是一个有效的空指针常量但5不是.但是你无法编写一个可以构造的类型,3而不是5类似的类型.