使用删除的移动和复制构造函数的类的就地构建

时间:2018-10-14 15:11:27

标签: c++ c++11 inheritance move

假设我有一个带有删除的copy和move构造函数的类。我想拥有一个工厂函数,该函数根据一些布尔x在适当的位置构造对象,而无需分配动态内存(没有unique_ptr,new等)。

两个问题:

  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

1 个答案:

答案 0 :(得分:0)

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

您需要一个Dynamic结构体来作为返回类型:

// 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结构的引用。