具有已删除移动和复制构造函数的类的就地构造
In place construction for class with deleted move and copy constructors
>假设我有一个删除了复制和移动构造函数的类。我想要一个工厂函数,它根据一些布尔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
结构的引用。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类