如何避免共享指针的复制赋值运算符c ++

Posted

技术标签:

【中文标题】如何避免共享指针的复制赋值运算符c ++【英文标题】:How to avoid copy assignment operator c++ for a shared pointer 【发布时间】:2021-10-13 13:26:08 【问题描述】:

考虑下面的行来创建类foo 的对象creature

foo = creature(choice);

这会在将其分配给foo 之前创建一个临时的creature 对象。这也意味着将调用析构函数。如果我不希望这种情况发生,并且我不想实现复制赋值运算符,那么我将使用以下命令创建它:

creature foo(choice);

我该如何为下面的行做同样的事情?同样,生物的析构函数会被调用,我想避免这种情况。

std::shared_ptr<creature> creature_sp = std::make_shared<creature>(creature(choice));

【问题讨论】:

std::shared_ptr&lt;creature&gt; creature_sp = std::make_shared&lt;creature&gt;(choice); 应该可以工作。如果没有,则需要更多信息。此外,您可能会发现Copy Elision 很有启发性。 "我不想实现复制赋值运算符" - 在foo = creature(choice); 中,它将使用移动赋值运算符(如果它没有被删除)来移动临时保存的数据到foo。此外,您只能初始化一个变量一次。创建shared_ptr 时,不应调用任何析构函数。从 C++17 开始,这是有保证的。 这样做:std::shared_ptr&lt;creature&gt; creature_sp = std::make_shared&lt;creature&gt;(choice); @DavidSchwartz 好收获 【参考方案1】:

对象创建部分应该是:

std::make_shared<creature>(choice);

make_shared 使用完美转发将参数转发给模板类型的构造函数——这就是 make_shared 存在的全部原因。

您还可以使用auto 避免出现拼写错误(DRY principle):

auto creature_sp = std::make_shared<creature>(choice); 

【讨论】:

以上是关于如何避免共享指针的复制赋值运算符c ++的主要内容,如果未能解决你的问题,请参考以下文章

如何从基类调用派生赋值运算符?

C/C++编程笔记:用C++编写赋值运算符,一般什么情况下用?

C语言结构体指针成员所指向的变量如何访问?

如何访问禁用“=”运算符的类的对象?

在具有智能指针的类上正确实现复制构造函数和等于运算符

c++中拷贝构造函数和赋值运算符重载本质上一样么