gpt4 book ai didi

c++ - gcc shared_ptr复制赋值实现

转载 作者:太空狗 更新时间:2023-10-29 23:44:12 26 4
gpt4 key购买 nike

我正在扫描 GCC 5 中的 shared_ptr 实现,我看到了以下内容:

  __shared_ptr&
operator=(__shared_ptr&& __r) noexcept
{
__shared_ptr(std::move(__r)).swap(*this);
return *this;
}

我的问题是为什么在交换之前 临时的额外移动构造?我假设编译会消除任何额外的开销——但为什么不直接调用 __r.swap(*this)?有没有我遗漏的一些聪明的副作用?

我看到类中的其他函数也使用相同的模式实现,我能理解接受 const 引用但接受右值引用的情况吗?

最佳答案

首先,这就是标准所说的,GCC 只是严格遵守。

这样赋值运算符就有一个后置条件 __r.empty() 你的建议无法实现,所以按照你的建议实现它会对标准所说的产生不同的影响,并且所以将是不合格的。

即这个断言成立:

auto p1 = std::make_shared<int>(1);
auto p2 = std::make_shared<int>(2);
p1 = std::move(p2);
assert( !p2 );

“聪明的副作用”是你创建了一个新的empty shared_ptr,它在交换后最终保留了 *this 的旧值,然后退出的范围。这意味着 *this 的旧值不会在 __r 中结束。

关于c++ - gcc shared_ptr复制赋值实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34277238/

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