C++调用嵌套模板类析构函数

rob*_*twb 7 c++ templates destructor nested-class

假设我有一个类型为std :: vector :: iterator的变量x,它被分配(出于其他原因)并且放置为new,例如

new((void*)&x) std::vector<int>::iterator();
Run Code Online (Sandbox Code Playgroud)

如何以符合标准的方式调用析构函数?干

x.std::vector<int>::iterator::~iterator();
Run Code Online (Sandbox Code Playgroud)

例如在gcc中工作但不是clang.

Mar*_*cia 1

所有标准(以及符合标准的)迭代器都遵循 的Iterator概念,该概念必须是Destructible。因此,只需调用迭代器的析构函数就足够了,就像在使用放置 new 构造的任何其他(非平凡)类型中一样。

\n\n
x.~iterator_type();   // where x is an iterator\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,如果通过指针引用迭代器,则必须使用->运算符:

\n\n
#include <vector>\n\n\nint main() {\n    auto buffer = new char[sizeof(std::vector<int>::iterator)];\n\n    auto iterator = new((void*)buffer) std::vector<int>::iterator();\n    iterator->std::vector<int>::iterator::~iterator();\n\n    delete[] buffer;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

实例(GCC)

\n\n

更新:似乎 Clang 在编译(我认为符合标准)代码时存在一些问题。您可以通过在调用析构函数时提供间接寻址来解决此问题:

\n\n
#include <vector>\n\ntemplate<typename T>\nvoid call_destructor(T* x) {\n    x->~T();\n}\n\nint main() {\n    auto buffer = new char[sizeof(std::vector<int>::iterator)];\n\n    auto iterator = new((void*)buffer) std::vector<int>::iterator();\n    //iterator->std::vector<int>::iterator::~iterator();\n    call_destructor(iterator);\n\n    delete[] buffer;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

活生生的例子(叮当声)

\n\n

更新:是的。这是 clang 中的错误:http://llvm.org/bugs/show_bug.cgi ?id=12350 。请参阅 Dieter L\xc3\xbcking\ 的评论

\n\n
\n\n

对于造成的混乱,我向你们所有人,尤其是 OP 表示非常抱歉。

\n