gpt4 book ai didi

c++ - 在(虚拟)父类中放置新的

转载 作者:行者123 更新时间:2023-11-30 01:33:56 26 4
gpt4 key购买 nike

我有这个 CRTP:

template <class T>
struct S {
void clear() { new (this) T; }
};

class SS : public S<SS> {
int i = 5;
};

int main() {
SS s;
s.clear();
}

clear() 是否保证按预期工作? S 是否为虚拟是否重要?

就此而言,我们可以假设所有继承 S 的类除了基本类型或 POD 类型外没有任何其他类型,因此没有花哨的构造函数和析构函数。

我用 gcc 和 valgrind 编译似乎没有提示,但感觉很奇怪。

最佳答案

要在内存中的正确位置重新创建子类型,您必须转换 this 指针。

此外,如果您不调用析构函数,则必须断言该类型是可平凡破坏的:

template <class T>
struct S {
void clear() {
static_assert(std::is_base_of_v<S, T>);
static_assert(std::is_trivially_destructible_v<T>);
new (static_cast<T*>(this)) T;
}
};

Valgrind 没有发出任何警告,因为来自基类的 this 与派生类相同,您没有覆盖分配的任何内存。

关于c++ - 在(虚拟)父类中放置新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57256045/

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