为什么隐式调用迭代器析构函数
Why is the iterator destructor implicitly called?
我正在为我的foo类创建一个迭代器接口,但在调试时,迭代器的析构函数在第一次测试后被隐式调用。
// Setup for test
// First test
foo::Iterator itr = obj->begin();
int first_value = (itr++)->value; // Destructor called here
// Other tests with itr
我浏览了调用堆栈,注意到这一行中的其他所有调用都按预期工作。唯一的问题似乎是,一旦执行了行中的每一个其他调用(后缀增量和箭头运算符(,就会隐式调用析构函数。为什么会发生这种情况?
后缀增量
为什么你认为每个人都告诉你不要使用它?后缀增量是一个前缀增量,带有一个额外的副本,必须构建它,然后无故销毁。
这是正确的代码:
foo::Iterator itr = obj->begin();
int first_value = itr->value;
++itr;
表达式itr++
产生两个值:旧值(将在表达式中使用(和增量值(作为副作用,在计算表达式的rhs后将在itr
中(。使用(itr++)->value
时,旧值应一直有效到;
,然后进行销毁。
如果您不想在那里有析构函数,建议使用int first_value itr->value; ++itr;
。或者,更好的是,如果您可以重新制定代码,请使用(++itr)
,即前缀增量。
相关文章:
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?
- C++:复制迭代器的构造函数
- 专门C++使用指针值类型的通用迭代器的模板函数?
- 从 std::vector 迭代器中执行函数指针
- 如何确定迭代器在 c++ 模板函数中指向的对象的类型?
- 如何使用提升范围将自定义迭代器封装在函数中
- 调用模板函数的问题"No matching function for call"参数:迭代器、对象函数
- 迭代器end()函数与指针算术无法使用
- C++迭代器作为 lambda 函数中的参数,断言失败:"vector iterators incompatible"
- 为 map<T1、T2> 迭代器创建模板函数
- 将迭代器传递到函数中
- 如何使用 2 个迭代器进行求和函数计算映射<字符串、双精度>
- 段错误:使用迭代器的插入函数
- C++带有迭代器的模板函数
- 在C++中为迭代器编写运算符==函数
- 字符串迭代器和理解函数
- 类成员容器迭代器在成员函数std::find中不兼容,但为什么不兼容呢
- 从迭代器对创建函数参数包
- 如何将模板类的容器的迭代器传递给函数
- 使用类型特征为字符串迭代器专门化模板函数