我已经更改了问题标题和正文,看看它是否更适合:)。
我在 cpp首选项上阅读了一个成员函数签名:unique_ptr/重置。
void reset( pointer ptr = pointer() ) noexcept;
pointer
是unique_ptr
的成员类型,记录为
pointer
|std::remove_reference<Deleter>::type::pointer
该类型是否存在,否则T*
.必须满足NullablePointer
我在评论中学到了什么:
pointer ptr = pointer()
在某种程度上等同于例如int
,using pointer = int*; pointer ptr = pointer()
- 如果它是一个内置类型,如
int
,那么ptr
是一个零初始化变量。我在这里得到了一个带有0/NULL/nullptr
int*
指针。 using pointer = int*; pointer ptr = pointer()
没有"原始"声明,即int* ptr = int*()
不起作用。
我还阅读了内置类型是否有默认构造函数? 这很有帮助。
我想更多地了解这种行为(内置类型可以用自定义类的方式构造(,如果可以更详细地解释的话:
using pointer = int*; pointer ptr = pointer()
这个语句真的没有"原始"语法吗?我曾经认为所有使用typedef
或using
都可以用"原始"版本写下来。就像一对一的映射一样。
不需要您所说的"原始"语法,因为指针可以用0
初始化为零。
int *p = 0; // nullptr
我想它可能对模板参数推导有用,但我们已经有一个语法:(int*)0
.实际上没有必要为这样的小东西添加更多的语法(或者也许有人忘记添加它;但无论哪种方式,现在都没有必要了(。
T(...)
语法主要用于初始化用户定义类型的对象。
我曾经认为所有使用
typedef
或using
都可以用"原始"版本写下来。
这是另一个示例:
int a;
a.~int(); // syntax error
using Int = int;
a.~Int(); // ok!
第一个语句是不允许的,因为它是无操作。第二个不是因为在通用上下文中,它可能会做一些事情(销毁对象(而不是无操作。由于该语言不想不必要地限制通过别名进行此操作,因此允许这样做。
出于同样的原因,即使您无法写出语法,也允许pointer()
:如果不允许,那么在通用上下文中工作将是一件痛苦的事情。