>假设我有一个删除了复制和移动构造函数的类。我想要一个工厂函数,它根据一些布尔x
就地构造对象,而不分配动态内存(无unique_ptr、新等(。
两个问题:
-
为什么下面会抛出
use of deleted function 'Foo::Foo(const Foo&&)'
?搬迁在哪里发生?
我 怎样才能实现我想要做的事情?
谢谢。代码如下:
已编辑:
我试图做的是创建一个单一的工厂函数,该函数可以根据某个变量 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::variant
或std::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
结构的引用。