Вы можете назначить / инициализировать std::variant
напрямую с помощью prvalue типа, который вы хотите добавить:
parameters_t comParameters = std::array<uint8_t, 4>{};
, хотя это инициализирует ноль массива в отличие от вашего кода.
Если вы хотите избежать конструкции копирования / перемещения, связанной с этим, вы можете использовать
parameters_t comParameters(std::in_place_type<std::array<uint8_t, 4>>);
для инициализации или
comParameters.emplace<std::array<uint8_t, 4>>();
для назначения.
Оба все еще обнуляют инициализацию std::array
. Насколько я знаю, в настоящее время нет способа инициализировать объект по умолчанию в std::variant
.
std::get_if
возвращает указатель на объект в std::variant
, Он никогда не делает копию объекта.
Вместо std::get_if
вы также можете использовать std::get
. std::get
просто выдаст исключение, если вы попытаетесь получить доступ к неправильному типу и вернет ссылку на содержащийся объект. Он также никогда не копирует объект .:
auto& parameterReference1 = std::get<std::array<uint8_t, 4>>(comParameters);
Встроенные типы массивов, или ссылочные типы, или типы функций не допускаются в списке типов std::variant
, потому что типы необходимы для удовлетворения концепции бытия. разрушаемый, что означает, что выражение
t.~T()
, где t
имеет тип T
, должно быть правильно сформировано. Это не относится к встроенным массивам, но почти ко всем другим типам разумных объектов.