防止自定义迭代器获取nullptr

prevent custom iterator from getting nullptr

本文关键字:获取 nullptr 迭代器 自定义      更新时间:2023-10-16

我为它编写了一个PriorityQueue类和一个迭代器类。但我不明白为什么这些行编译?

PriorityQueue<int,int> pq;
   auto z =pq.begin();
   z=nullptr;

我的意思是,迭代器不是指针(它里面有一个指针,但它们之间没有转换)。我怎样才能防止这种情况发生呢?

编辑:开始声明:

const iterator begin() const;

您的单参数构造函数

iterator::iterator(Node<Priority,T>* node) : node(node) {}

建立一个用户定义的从指针类型Node<Priority,T>*iterator的转换。由于nullptr_t隐式地转换为任何指针类型,因此可以将nullptr转换为iterator类型。然后,在调用自动生成的移动或复制赋值操作符之前,示例中的z = nullptr;行隐式地将nullptr转换为迭代器类型。

修复:添加explicit关键字到你的构造函数

explicit iterator(Node<Priority,T>* node) : node(node) {}

标准中的规则,第12.3.1节:

没有函数说明符的构造函数 explicit指定了从其形参类型到其类类型的转换。这种构造函数称为转换构造函数

显式构造函数与非显式构造函数一样构造对象,但仅在直接初始化语法(8.5)或显式使用强制类型转换(5.2.9,5.4)时才这样做。默认构造函数可以是显式构造函数;这样的构造函数将用于执行默认初始化或值初始化(8.5)。