Std :: перемещение с внутренними объектами - не подходит для вызова

MrBaPHuk спросил: 31 июля 2018 в 09:52 в: c++

Код ниже не компилируется. Обычно:

#include "preset.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    SomeA a1(4);
    WrapA wA1(a1);
    WrapA wA2(std::move(wA1)); //fails to compile here
    return a.exec();
}

preset.h:

    #include <QDebug>
    class SomeA
    {
    public:
        SomeA(int l){val = l;}
        SomeA(const SomeA& original): val(original.val){qDebug()<<"sA copy;";}
        SomeA(SomeA&& original){std::swap(val, original.val); qDebug()<<"sA move;";}  
        SomeA operator = (const SomeA&);
        int val{0};
    };    class WrapA
    {
    public:
        WrapA(SomeA obj): aObj(obj){}
        WrapA(const WrapA& original): aObj(original.aObj) {qDebug()<<"wA copy";}
        WrapA(WrapA&& original) {aObj(std::move(original.aObj)); qDebug()<<"wA move";} //no match for call (SomeA)(std::remove_reference<SomeA&>::type)
        SomeA aObj{0};
    };   

Предполагаю, что std :: move не отбрасывается со ссылкой на rvalue. Любые идеи о том, как достичь такого глубокого движения? Думаю, я что-то пропустил, но не могу понять, что именно

1 ответ

Есть решение
Sebastian Redl ответил: 31 июля 2018 в 09:57
 WrapA(WrapA&& original) {aObj(std::move(original.aObj)); qDebug()<<"wA move";}

Вы хотели написать это как

 WrapA(WrapA&& original) : aObj(std::move(original.aObj)) {qDebug()<<"wA move";}

См. также конструктор копирования для справки.

(Должен быть указан вопрос уже похож на этот, но я не могу его найти.)