使用已删除的复制构造函数和初始化列表重载调用类定义中的成员构造函数重载

时间:2015-12-09 08:44:30

标签: c++ c++11 initialization

struct Foo
{
    Foo(const Foo&) = delete;
    Foo(int a, int b);
    Foo(std::initializer_list<int>);    
};

struct Bar
{
    Foo f = Foo(1, 2);
    // Foo f = {1, 2} - calls the initializer_list overload
};

如果复制构造函数被删除,如何用两个整数初始化Foo?

1 个答案:

答案 0 :(得分:6)

为了使初始化起作用,有问题的类型必须是MoveConstructible * 。在您的特定情况下,提供移动构造函数将满足此要求:

Foo(Foo&&) = default;

如果这不是一个选项,您可以在默认构造函数中初始化该成员,并将其用作其他构造函数中的委托构造函数。

struct Bar
{
    Bar() : f(1, 2) {}
    Bar(const FooBar&) : Bar() {}
    Bar(double x) : Bar() {}
    Foo f;
};

*这并不意味着会制作副本。 T t = T()是复制省略的简单候选人。但是,必须可以访问可行的构造函数。