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.
所有标准(以及符合标准的)迭代器都遵循 的Iterator概念,该概念必须是Destructible。因此,只需调用迭代器的析构函数就足够了,就像在使用放置 new 构造的任何其他(非平凡)类型中一样。
x.~iterator_type(); // where x is an iterator\nRun Code Online (Sandbox Code Playgroud)\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}\nRun Code Online (Sandbox Code Playgroud)\n\n\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}\nRun 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对于造成的混乱,我向你们所有人,尤其是 OP 表示非常抱歉。
\n