'auto t = new decltype(nullptr)'做什么?

时间:2018-02-08 05:40:11

标签: c++ gcc null language-lawyer

在gcc(可能还有其他编译器)下,可以编写:

auto t = new decltype(nullptr);

我不确定这是做什么的。这是否为nullptr_t类型的对象分配内存?

我的问题与nullptr nullptr_t的类型无关,我的问题是new nullptr_t()是如何理解的?

3 个答案:

答案 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;