具有已删除移动和复制构造函数的类的就地构造

In place construction for class with deleted move and copy constructors

本文关键字:构造函数 复制 删除 移动      更新时间:2023-10-16

>假设我有一个删除了复制和移动构造函数的类。我想要一个工厂函数,它根据一些布尔x就地构造对象,而不分配动态内存(无unique_ptr、新等(。

两个问题:

  1. 为什么下面会抛出use of deleted function 'Foo::Foo(const Foo&&)'?搬迁在哪里发生?

  2. 怎样才能实现我想要做的事情?

谢谢。代码如下:

已编辑

我试图做的是创建一个单一的工厂函数,该函数可以根据某个变量 X 创建父级或子级。在删除副本/移动的情况下,此构造需要就地进行。

class Foo
{
public:
Foo(int _x) : x(_x) {}
Foo(const Foo&) = delete;
Foo(const Foo&&) = delete;
int x = 10;;
};
class Bar : public Foo
{
public:
Bar(int _y) : Foo(10), y(_y) {}
int y;
};
Foo make_dynamic(int a, bool x) {
if (x) {
return Foo{a};
} else {
return Bar{a};
}
}
Foo make_just_foo(int a)
{
return Foo{a};
}
Foo make_just_bar(int a)
{
return Bar{a};
}
int main() {
Foo&& dynamic = make_dynamic(10, true); // works when copy/move not deleted
Foo&& f = make_just_foo(10);
Foo &&b2 = make_just_bar(10); // works when copy/move not deleted
}

新链接:https://coliru.stacked-crooked.com/a/a7a3eefd685f0adb

我能完成这项工作的唯一方法是使用union,(因为我无法使用std::variantstd::any来工作,因为它们都需要 Foo 和 Bar 至少是可移动的(

您需要一个动态结构来充当返回类型:

// acts as home made std::variant
struct Dynamic {
union {
Foo foo;
Bar bar;
};
int active;
};

并使用指定的初始值设定项 C++20 构造它,但已经在当前的 GCC 和 Clang 中工作:

Dynamic make_dynamic(int a, bool x) {
if (x) {
return {{.foo = Foo{2}}, 0};
} else {
return {{.bar = Bar{2}}, 1};
}
}

最后,我们可以得到我们的动态 Foo:

Dynamic dynamic = make_dynamic(10, true);
Foo* foo = dynamic.get();

https://godbolt.org/z/7JWB6D

您还可以添加 getFoo(( 和 getBar(( 方法来返回对Dynamic结构的引用。