gpt4 book ai didi

c++ - 我可以在 operator= 中使用 placement new(this) 吗?

转载 作者:可可西里 更新时间:2023-11-01 16:38:59 25 4
gpt4 key购买 nike

背景:我有一个包含许多变量的复杂类。我有一个可靠且经过测试的复制构造函数:

Applepie::Applepie( const Applepie &copy) :
m_crust(copy.m_crust),
m_filling(copy.m_filling)
{
}

在初始化列表中调用的一些成员变量拷贝构造函数执行分配。

问题:我需要创建 operator=。我可以简单地执行以下操作,而不是使用赋值而不是初始化列表来复制现有的构造函数,并释放正在被替换的内存等等,而是可以简单地执行以下操作:

Applepie& Applepie::operator=( const Applepie &copy)
{
if( this != &copy)
{
this->~Applepie(); // release own object
new(this) Applepie(copy); // placement new copy constructor
}
return *this;
}

换句话说, destroy self 后跟一个在语义上与 operator= 相同的 placement new 复制构造函数吗?

这似乎有可能显着减少重复代码并确认每个变量都已正确初始化,但代价是在赋值过程中可能会略微降低效率。我是否遗漏了一些更晦涩的东西?

理由:我的实际类(class)有大约 30 个变量。我担心我的复制构造函数和赋值运算符都必须复制所有 30 个,并且代码可能会出现分歧,从而导致两个操作以不同的方式执行操作。

最佳答案

正如 Herb Sutter 在“Exceptional C++”中所说的那样,它不是异常安全的。这意味着,如果在 new 或构造新对象期间出现任何问题,则赋值的左侧操作数处于错误(未定义)状态,需要更多麻烦。我强烈建议使用 copy & swap idiom .

Applepie& Applepie::operator=(Applepie copy)
{
swap(m_crust, copy.m_crust);
swap(m_filling, copy.m_filling);
return *this;
}

当您的对象也使用 Pimpl 习惯用法(指向实现的指针)时,交换仅通过更改两个指针来完成。

关于c++ - 我可以在 operator= 中使用 placement new(this) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7177884/

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