Зачем мне нужен конструктор перемещения, если конструктор принимает значения

У меня есть следующий пример:

 #include <cstdint>
class A
{
public:
    A(const A&) = delete;
    A& operator = (const A&) = delete;
    A(A&&) = default; // why do I need the move constructor
    A&& operator = (A&&) = delete;
    explicit A(uint8_t Val)
    {
        _val = Val;
    }
    virtual ~A() = default;
private:
    uint8_t _val = 0U;
};
class B
{
public:
    B(const B&) = delete;
    B& operator = (const B&) = delete;
    B(B&&) = delete;
    B&& operator = (B&&) = delete;

    B() = default;
    virtual ~B() = default;
private:
    A _a = A(4U); // call the overloaded constructor of class A
};

int main()
{
    B b;
    return 0;
}

Зачем мне нужен конструктор перемещения "A(A&&) = default;" в? Я не мог кодировать строку, где назван Move-конструктор.

Спасибо заранее.

1 ответ

Решение

A _a = A(4U) в этом случае зависит от конструктора перемещения.

Этот тип инициализации называется копированием инициализации, и в соответствии со стандартом он может вызывать конструктор перемещения, см. 9.3 / 14.

Другие вопросы по тегам