gpt4 book ai didi

c++ - 这个 _com_ptr_t move 分配有什么目的吗?

转载 作者:行者123 更新时间:2023-11-30 03:14:08 25 4
gpt4 key购买 nike

所以我们有这段代码

_com_ptr_t& operator=(_com_ptr_t&& cp) throw()
{
if (m_pInterface != cp.m_pInterface) {
Interface* pOldInterface = m_pInterface;

m_pInterface = cp.m_pInterface;
cp.m_pInterface = nullptr;

if (pOldInterface != nullptr) {
pOldInterface->Release();
}
}
return *this;
}

pOldInterface 在 move 分配时是 Release()d。为什么 move 赋值/构造函数操作没有实现为交换,让 Release() 自然发生在 move 对象的析构函数上,只需使用 nullptr 赋值或 Release() 手动提前触发它?

我总是将 move 构造函数实现为交换操作。这是不好的做法吗?

我的代码是

_com_ptr_t& operator=(_com_ptr_t&& cp) throw()
{
if (m_pInterface != cp.m_pInterface) {
Interface* pOldInterface = m_pInterface;
m_pInterface = cp.m_pInterface;
cp.m_pInterface = pOldInterface;
// or just std::swap(m_pInterface, cp.m_pInterface);
}
return *this;
}

MS _com_ptr_t 选择背后是否有原因?这个问题也适用于任何 move 分配/构造函数,所以这个上下文或多或少是相关的。这完全取决于我们是发布数据还是交换数据?

最佳答案

I always implement move constructors as swap operations. Is this bad practice?

通常会注意到一个不好的做法,但取决于 Release() 做了什么(在第一个代码中)。如果 Release() 必须在 Interface move 时处理任何相关对象,则实现可能不同于简单的交换操作。

对于小案例,我个人更喜欢std::exchange习语(需要 或更高版本),这在 move 操作中有意义。

_com_ptr_t& operator=(_com_ptr_t&& cp) throw()
{
if (m_pInterface != cp.m_pInterface)
{
m_pInterface = std::exchange(cp.m_pInterface, nullptr);
}
return *this;
}

关于c++ - 这个 _com_ptr_t move 分配有什么目的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58140156/

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