Битовые поля «Инициализация в классе» приводит к & quot; ошибке: в качестве левого операнда присваивания требуется lvalue & quot;

struct bitfield {
int i = 0;  // ok
int j : 8 = 0;  // error: lvalue required as left operand of assignment
};

Каков правильный синтаксис для инициализации битовых полей с помощью функции «инициализация в классе» в C ++ 11?

14

Решение

Каков правильный синтаксис для инициализации битовых полей с помощью функции «инициализация в классе» в C ++ 11?

Вы не можете инициализировать битовые поля в классе. Параграф 9.2 стандарта C ++ 11 определяет грамматику для деклараторов членов класса:

[…]

член-описатель:

описатель virt-specier-seq (opt) pure-спецификатор (opt)

объявление-скобка-или-равно-инициализатор (опция)

идентификатор (opt) атрибут-спецификатор-seq (opt): константа-выражение

Как видите, объявления для членов битового поля не могут быть завершены скобки или равно-инициализатор.

9

Другие решения

Это было поднято как Основная проблема 1341 к стандарту C ++, но было отклонено Основной рабочей группой C ++ в октябре 2015 года как NAD («не дефект») — см. http://open-std.org/JTC1/SC22/WG21/docs/cwg_closed.html#1341

10

Вы можете написать конструктор со списком инициализаторов, чтобы задать значения по умолчанию для ваших битовых полей.

struct bitfield {
int i;
int j : 8;

bitfield() : i(0), j(0) {};
};

Вы также можете создавать поля только для чтения со значениями по умолчанию.

struct _UserRegister1
{
uint8_t _RES0 : 1;
const uint8_t reserved1 : 1;
uint8_t _HTRE : 1;
const uint8_t reserved2 : 3;
uint8_t _VDDS : 1;
uint8_t _RES1 : 1;

_UserRegister1() : reserved1(1), reserved2(7) {};
};
1

Вы не можете (в C ++ 11) инициализировать битовые поля в классе.

В MSVC и gcc (с расширениями) аноним union а также struct Код позволяет обойти это немного.

struct bitfield {
int i = 0;  // ok
union {
uint32_t raw = 0;
struct {
int j : 8;
int x : 3;
};
};
};

где мы смешиваем фиксированный размер raw с union над битовыми полями, затем в классе инициализировать raw элемент.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector