【问题标题】:What does 'auto t = new decltype(nullptr)' do? [duplicate]'auto t = new decltype(nullptr)' 有什么作用? [复制]
【发布时间】:2026-01-03 10:00:02
【问题描述】:

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

auto t = new decltype(nullptr);

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

我的问题不是关于 nullptr 的类型,即 nullptr_t,我的问题是 new nullptr_t() 有什么意义?

【问题讨论】:

  • 这是否为 nullptr_t 类型的对象分配内存? 是的。
  • @Hassen:它的意义与new int{}; 的意义完全相同。对象是对象,您可以使用new 创建对象实例。你有什么困惑?

标签: c++ gcc null language-lawyer


【解决方案1】:

这是否为nullptr_t 类型的对象分配内存?

是的。

我的问题是new nullptr_t() 有什么意义?

从句法的角度来看,这并没有错。

从语义的角度来看,我看不出它有任何合理的用例。从使用的角度来看,nullptr_t 的所有实例基本相同。

但是,有人可能会提出一个我们尚未接触过的好用例。

【讨论】:

    【解决方案2】:

    我的问题是新的nullptr_t() 有什么意义?

    这有什么意义:

    struct S
    {
    };
    
    auto ptr = new S{};
    

    这与动态分配nullptr_t 实例一样有意义。 S 没有内容,因此它在其地址之外没有状态(通常,相同类型的两个对象不能具有相同的地址)。因此,大多数采用S 的函数都可以采用任何S 实例并产生相同的结果。哦,是的,nullptr_t 有更多的花里胡哨,但它主要是一种与所有其他对象类型不同的对象类型。

    当然,一般来说你不会故意这样做。但是,如果您在模板代码中,并且有人将 nullptr_t 作为模板参数传递,您为什么要编写 new T{}; 无法编译的代码?它不会伤害任何东西。

    【讨论】:

      【解决方案3】:

      如果你去掉语法糖,语句变成:

      std::nullptr_t* t = new std::nullptr_t;
      

      所以这只是一个有效的内存指针,它指向大小为 std::nullptr_t 的东西;

      【讨论】:

      • 为什么你认为它不等同?
      • 这是一个英语习语,提出的问题是问这与等有什么不同。
      最近更新 更多