【发布时间】: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 好收获
标签: c++ c++11 smart-pointers