给定std::vector<A>::iteratorstd::map<A, B>::iterator,如何显式调用它们的析构函数?我不知道这些类型的实际名称,因为::iterator成员类型是特定于实现的类的typedef / alias。

我问这个问题,因为我将这些迭代器存储在不受限制的c ++联合中,而Visual Studio要求我手动处理销毁。我不能简单地调用活动元素的析构函数,并假设迭代器不需要清理,但是那是不好的做法。

最佳答案

像这样:

// let iter be vector<int>::iterator to be destroyed
iter.std::vector<int>::iterator::~iterator();



  我不知道这些类型的实际名称,因为:: iterator成员类型是特定于实现的类的typedefs / alias。


没关系类型别名也是类型名称。



LLVM似乎存在一个错误:https://bugs.llvm.org//show_bug.cgi?id=12350

在解决该问题之前,请先引入一个非嵌套别名:

using iterator = std::vector<int>::iterator;
iterator it;
it.iterator::~iterator();


或将类型称为模板参数(此代码来自错误报告):


template <typename T>
inline void placement_delete(T *x)
{
   // C++ lacks placement delete, so fake it with a function
   x->~T();
}

07-24 09:44
查看更多