像自定义类一样构造的指针(内置类型)如何工作?



我已经更改了问题标题和正文,看看它是否更适合:)。


我在 cpp首选项上阅读了一个成员函数签名:unique_ptr/重置。

void reset( pointer ptr = pointer() ) noexcept;

pointerunique_ptr的成员类型,记录为

pointer|std::remove_reference<Deleter>::type::pointer该类型是否存在,否则T*.必须满足NullablePointer

我在评论中学到了什么:

  1. pointer ptr = pointer()在某种程度上等同于例如intusing pointer = int*; pointer ptr = pointer()
  2. 如果它是一个内置类型,如int,那么ptr是一个零初始化变量。我在这里得到了一个带有0/NULL/nullptrint*指针。
  3. using pointer = int*; pointer ptr = pointer()没有"原始"声明,即int* ptr = int*()不起作用。

我还阅读了内置类型是否有默认构造函数? 这很有帮助。


我想更多地了解这种行为(内置类型可以用自定义类的方式构造(,如果可以更详细地解释的话:

using pointer = int*; pointer ptr = pointer()

这个语句真的没有"原始"语法吗?我曾经认为所有使用typedefusing都可以用"原始"版本写下来。就像一对一的映射一样。

不需要您所说的"原始"语法,因为指针可以用0初始化为零。

int *p = 0; // nullptr

我想它可能对模板参数推导有用,但我们已经有一个语法:(int*)0.实际上没有必要为这样的小东西添加更多的语法(或者也许有人忘记添加它;但无论哪种方式,现在都没有必要了(。

T(...)语法主要用于初始化用户定义类型的对象。

我曾经认为所有使用typedefusing都可以用"原始"版本写下来。

这是另一个示例:

int a;
a.~int(); // syntax error
using Int = int;
a.~Int(); // ok!

第一个语句是不允许的,因为它是无操作。第二个不是因为在通用上下文中,它可能会做一些事情(销毁对象(而不是无操作。由于该语言不想不必要地限制通过别名进行此操作,因此允许这样做。

出于同样的原因,即使您无法写出语法,也允许pointer():如果不允许,那么在通用上下文中工作将是一件痛苦的事情。

相关内容

最新更新