Я не эксперт по c ++ 0x, но я знаю, что строгие гарантии pod
-ness были ослаблены в c++0x
с введением класса standard-layout
.Ваш класс с конструктором не pod
, но я считаю, что это standard-layout
, и поэтому, возможно, стоит проверить совместимость ваших компиляторов с этим аспектом нового стандарта.Я думаю, что проблемы, с которыми вы сталкивались, были достаточно исправлены с c++0x
.
Я также считаю , что инициализация фигурных скобок стандартных классов макета также разрешена в c ++ 0x,См. Initializer lists
и Uniform initialization
раздел этой статьи Википедии.
Поиск того, что исправления класса стандартной компоновки должны дать довольно хороший список того, что может сломаться длятипы стручков в текущем стандарте.Например, reinterpret_cast небезопасен в c ++ 03 для типов, не являющихся модулями (выравнивание может быть неправильным), но безопасен в c ++ 0x для классов стандартной компоновки.
Короче говоря, я думаю, что ваши разочарования хорошо известны и, возможно, даже устранены в новом стандарте, но я не думаю, что будет возможно исправить их все с помощью текущего стандарта.
Мой подход заключается в том, чтобы попробовать оставить прежний код без изменений и медленно мигрировать на новую версию вашего класса:
namespace version_1_1
{
struct VlanData
{
uint16_t mEtherType;
uint16_t mVlanId;
uint8_t mVlanPriority; // New member
};
vlanData
convert_VlanData( ::VlanData const& v)
{
VlanData v2 = {v.mEtherType,v.mVlanId, 0};
return v2;
}
}
, а затем вы четко и ясно указываете, когда вы используете что - и переносите вещикогда вам нужно.