История изменений
Исправление 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. Там кучка нюансов на это.
В общем, всем спасибо, вопрос вроде как закрыт.