gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:39:37 25 4
gpt4 key购买 nike

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

new((void*)&x) std::vector<int>::iterator();

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

x.std::vector<int>::iterator::~iterator();

例如在 gcc 中有效但在 clang 中无效。

最佳答案

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

x.~iterator_type();   // where x is an iterator

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

#include <vector>


int main() {
auto buffer = new char[sizeof(std::vector<int>::iterator)];

auto iterator = new((void*)buffer) std::vector<int>::iterator();
iterator->std::vector<int>::iterator::~iterator();

delete[] buffer;
}

LIVE EXAMPLE (GCC)

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

#include <vector>

template<typename T>
void call_destructor(T* x) {
x->~T();
}

int main() {
auto buffer = new char[sizeof(std::vector<int>::iterator)];

auto iterator = new((void*)buffer) std::vector<int>::iterator();
//iterator->std::vector<int>::iterator::~iterator();
call_destructor(iterator);

delete[] buffer;
}

LIVE EXAMPLE (clang)

更新:是的。这是 clang 中的一个错误:http://llvm.org/bugs/show_bug.cgi?id=12350 . See Dieter Lücking's comment .


对于this mess,我对你们所有人,尤其是OP,感到非常抱歉.

关于C++ 调用嵌套模板类析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21847816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com