如何避免共享指针的复制赋值运算符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<creature> creature_sp = std::make_shared<creature>(choice);
应该可以工作。如果没有,则需要更多信息。此外,您可能会发现Copy Elision 很有启发性。
"我不想实现复制赋值运算符" - 在foo = creature(choice);
中,它将使用移动赋值运算符(如果它没有被删除)来移动临时保存的数据到foo
。此外,您只能初始化一个变量一次。创建shared_ptr
时,不应调用任何析构函数。从 C++17 开始,这是有保证的。
这样做:std::shared_ptr<creature> creature_sp = std::make_shared<creature>(choice);
@DavidSchwartz 好收获
【参考方案1】:
对象创建部分应该是:
std::make_shared<creature>(choice);
make_shared
使用完美转发将参数转发给模板类型的构造函数——这就是 make_shared
存在的全部原因。
您还可以使用auto
避免出现拼写错误(DRY principle):
auto creature_sp = std::make_shared<creature>(choice);
【讨论】:
以上是关于如何避免共享指针的复制赋值运算符c ++的主要内容,如果未能解决你的问题,请参考以下文章