在gcc(可能还有其他编译器)下,可以编写:
auto t = new decltype(nullptr);
我不确定这是做什么的。这是否为nullptr_t
类型的对象分配内存?
我的问题与nullptr
nullptr_t
的类型无关,我的问题是new nullptr_t()
是如何理解的?
答案 0 :(得分:3)
是否为
nullptr_t
类型的对象分配内存?
是
我的问题是
new nullptr_t()
如何理解?
从句法的角度来看,这并没有错。
从语义的角度来看,我无法看到任何明智的用例。从使用的角度来看,nullptr_t
的所有实例都基本相同。
但是,有人可能会提出一个我们还没有接触过的好用例。
答案 1 :(得分:2)
我的问题是新的
nullptr_t()
有什么意义?
这有什么意义:
struct S
{
};
auto ptr = new S{};
这与动态分配nullptr_t
实例几乎一样有意义。 S
没有内容,因此它的地址之外没有状态(两个相同类型的对象通常不能有相同的地址)。因此,采用S
的大多数函数都可以使用任何S
实例并产生相同的结果。哦,是的,nullptr_t
上有更多的花里胡哨,但它主要是一种与所有其他对象类型不同的对象类型。
当然,一般来说,你不会故意这样做。但是,如果您使用模板代码,并且有人将nullptr_t
作为模板参数传递,那么您为什么要编写new T{};
无法编译的代码?它并没有伤害任何东西。
答案 2 :(得分:1)
如果你删除了语法糖,那么声明就变成了:
std::nullptr_t* t = new std::nullptr_t;
所以这只是一个有效的内存指针,指向sizeof std :: nullptr_t;