【问题标题】:What is pointer() in unique_ptr?unique_ptr 中的指针()是什么?
【发布时间】:2021-10-27 05:11:18
【问题描述】:

我现在阅读了 libstdc++ 中的 unique_ptr 源代码。

 public:
   typedef _Tp*               pointer;
   typedef _Tp                element_type;      
   typedef _Tp_Deleter        deleter_type;

   // Constructors.
   unique_ptr()
   : _M_t(pointer(), deleter_type())
   { static_assert(!std::is_pointer<deleter_type>::value,
           "constructed with null function pointer deleter"); }

我不明白。“pointer()”是否调用构造函数?但“指针”是类型 _Tp* 的别名

【问题讨论】:

  • 它调用了_Tp*的默认构造函数,除了构造一个nullptr之外几乎没有任何作用。
  • 很明显,原始基本类型支持与类相同的默认构造语法。但是编译器(或其他)比只写nullptr 有什么优势吗?
  • 这能回答你的问题吗? Do built-in types have default constructors?

标签: c++ pointers initialization unique-ptr default-constructor


【解决方案1】:

对于所有类型,T() 是一个表达式,value-initialises 是该类型的未命名实例。对于非类、非数组类型,值初始化为zero-initialisation

对象的初始值是显式转换为T的整数常量零

对于指针类型,这是一个空指针

【讨论】:

    【解决方案2】:

    这个表达式

    pointer()
    

    对具有指针类型的类的数据成员pointer 进行零初始化。对于指针类型,这意味着将指针设置为空指针。

    来自 C++ 14 标准(8.5 初始化程序)

    11 一个对象,其初始值设定项是一组空括号,即 (), 应该是值初始化的

    8 对 T 类型的对象进行值初始化意味着:

    (8.4) — 否则,对象被零初始化。

    进一步

    6 对 T 类型的对象或引用进行零初始化意味着:

    (6.1) — 如果 T 是标量类型 (3.9),则对象被初始化为 通过将整型文字 0(零)转换为 T;104

    获得的值

    在脚注104中写着

    1. 如 4.10 中所述,转换其值的整数文字 为 0 的指针类型会导致空指针值

    【讨论】:

    • @gygy 完全没有。不客气。我赞成你的问题。:)
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2014-05-25
    • 2013-03-07
    • 1970-01-01
    • 2019-01-22
    • 2013-05-05
    相关资源
    最近更新 更多