gpt4 book ai didi

c++ - 返回具有 unique_ptr 成员的对象需要什么?

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:54 25 4
gpt4 key购买 nike

假设我有这个对象:

struct foo {
std::unique_ptr<int> mem;
virtual ~foo() = default;
};

我不能再返回在函数中创建的 foo 对象:

foo make_foo() {
foo result;

result.mem = std::make_unique<int>({});
return result;
}

正如可能指出的那样,我需要析构函数是虚拟的,因为这将是一个基类。但即使我使用默认析构函数,这还不够,我仍然无法返回在函数中创建的对象。

我得到错误:

error C2280: foo::foo(const foo &): attempting to reference a deleted function

有没有办法解决这个问题?

最佳答案

根据 [class.copy.ctor]/8

If the definition of a class X does not explicitly declare a move constructor, a non-explicit one will be implicitly declared as defaulted if and only if [...]

  • X does not have a user-declared destructor.

virtual ~foo() = default;

是用户声明的析构函数,您不再有移动构造函数,因此它尝试使用复制构造函数但不能,因为它已被删除,因为您有一个不可复制的成员。

要取回移动构造函数,并保持默认构造函数,您需要添加

foo() = default;
foo(foo&&) = default;
foo &operator=(foo &&) = default; // add this if you want to move assign as well

foo


在添加 foo(foo&&) = default; 时必须添加 foo() = default; 的原因是 foo(foo&&) = default ; 是一个使用声明的构造函数,如果您有任何用户声明的构造函数,则不再提供默认构造函数。


这是一个“hack”,但您可以做的是将虚拟析构函数移动到另一个类中,然后从中继承。这将为您提供 foo 中的虚拟析构函数,而无需声明它并为您提供所需的默认构造函数。看起来像

struct make_virtual
{
virtual ~make_virtual() = default;
};

struct foo : make_virtual {
std::unique_ptr<int> mem;
};

关于c++ - 返回具有 unique_ptr 成员的对象需要什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52541193/

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