LINUX.ORG.RU

История изменений

Исправление victor79, (текущая версия) :

Хм. Сейчас перепроверил, ошибки в описанном случае нет, и перемещение выполняется в желаемом виде:

    struct __attribute__((packed, aligned(1))) Token {
        char a = 0;
        Token() {}
        Token(int _a) : a(_a) {}
    };

    struct Data {
        int b = 0;
        Data(int _b) : b(_b) { qDebug() << "Data(int)"; }
        Data() { qDebug() << "Data()"; }
        Data(const Data&) { qDebug() << "Data(const Data&)"; }
        Data(Data&&) { qDebug() << "Data(Data&&)"; }
        Data &operator=(const Data&) { qDebug() << "=const Data&"; return *this; }
        Data &operator=(Data &&) { qDebug() << "=Data&&"; return *this; }
    };

    using T = pair<Token,Data>;

    T a{0,0};
    T b(a);

    qDebug() << "===testMove1";
    T c = std::move(a);

    qDebug() << "===testMove2";
    T d = T(Token(5),Data(6));

    qDebug() << "===withList";

    MyList<T> list;
    list += a;
    qDebug() << "===testListInsert";
    list.insert(list.begin(), b);
    qDebug() << "===END";
Data(int)
Data(const Data&)
===testMove1
Data(Data&&)
===testMove2
Data(int)
Data(Data&&)
===withList
Data(const Data&)
===testListInsert
Data(Data&&)
Data(Data&&)
Data(const Data&)
===END

Получается, что ошибка была не в packed, а в том, что я намудрил при указании в конструкторах и в перемещениях с атрибутами =default или =delete. Там кучка нюансов на это.

В общем, вопрос в части использования именно packed закрыт. Но существует возможность указания таких конструкторов, при совмещении которых в инкапсуляции с другими объектами, вроде нормальных, вторые становятся не нормальными.

Возможно is_move_constructible && is_move_assignable такие ситуации ловит, но мне теперь уже не проверить.

Исправление victor79, :

Хм. Сейчас перепроверил, ошибки в описанном случае нет, и перемещение выполняется в желаемом виде:

    struct __attribute__((packed, aligned(1))) Token {
        char a = 0;
        Token() {}
        Token(int _a) : a(_a) {}
    };

    struct Data {
        int b = 0;
        Data(int _b) : b(_b) { qDebug() << "Data(int)"; }
        Data() { qDebug() << "Data()"; }
        Data(const Data&) { qDebug() << "Data(const Data&)"; }
        Data(Data&&) { qDebug() << "Data(Data&&)"; }
        Data &operator=(const Data&) { qDebug() << "=const Data&"; return *this; }
        Data &operator=(Data &&) { qDebug() << "=Data&&"; return *this; }
    };

    using T = pair<Token,Data>;

    T a{0,0};
    T b(a);

    qDebug() << "===testMove1";
    T c = std::move(a);

    qDebug() << "===testMove2";
    T d = T(Token(5),Data(6));

    qDebug() << "===withList";

    MyList<T> list;
    list += a;
    qDebug() << "===testListInsert";
    list.insert(list.begin(), b);
    qDebug() << "===END";
Data(int)
Data(const Data&)
===testMove1
Data(Data&&)
===testMove2
Data(int)
Data(Data&&)
===withList
Data(const Data&)
===testListInsert
Data(Data&&)
Data(Data&&)
Data(const Data&)
===END

Получается, что ошибка была не в packed, а в том, что я намудрил при указании в конструкторах и в перемещениях с атрибутами =default или =delete. Там кучка нюансов на это.

В общем, вопрос в части использования именно packed закрыт. Но существует возможность указания таких конструкторов, при совмещении в инкапсуляции других объектов вроде нормальных, они становятся не нормальными.

Возможно is_move_constructible && is_move_assignable такие ситуации ловит, но мне теперь уже не проверить.

Исходная версия victor79, :

Хм. Сейчас перепроверил, ошибки в описанном случае нет, и перемещение выполняется в желаемом виде:

    struct __attribute__((packed, aligned(1))) Token {
        char a = 0;
        Token() {}
        Token(int _a) : a(_a) {}
    };

    struct Data {
        int b = 0;
        Data(int _b) : b(_b) { qDebug() << "Data(int)"; }
        Data() { qDebug() << "Data()"; }
        Data(const Data&) { qDebug() << "Data(const Data&)"; }
        Data(Data&&) { qDebug() << "Data(Data&&)"; }
        Data &operator=(const Data&) { qDebug() << "=const Data&"; return *this; }
        Data &operator=(Data &&) { qDebug() << "=Data&&"; return *this; }
    };

    using T = pair<Token,Data>;

    T a{0,0};
    T b(a);

    qDebug() << "===testMove1";
    T c = std::move(a);

    qDebug() << "===testMove2";
    T d = T(Token(5),Data(6));

    qDebug() << "===withList";

    MyList<T> list;
    list += a;
    qDebug() << "===testListInsert";
    list.insert(list.begin(), b);
    qDebug() << "===END";
Data(int)
Data(const Data&)
===testMove1
Data(Data&&)
===testMove2
Data(int)
Data(Data&&)
===withList
Data(const Data&)
===testListInsert
Data(Data&&)
Data(Data&&)
Data(const Data&)
===END

Получается, что ошибка была не в packed, а в том, что я намудрил при указании в конструкторах и в перемещениях с атрибутами =default или =delete. Там кучка нюансов на это.

В общем, всем спасибо, вопрос вроде как закрыт.