2014-11-21 5 views
1

В C++ 11 можно сделатьЗначения по умолчанию для битовых элементов

struct S {int i = 42;}; 

и всякий раз, когда один забывает инициализировать член I, он получить по умолчанию инициализируется 42. Я просто попытался это с как

битовыми полями
struct S {int i = 42 : 5;}; 

и я получаю

error: expected ';' before ':' token

ли это FEA для членов битового поля существует, и если да, то как его использовать?

+1

Похоже, что в конечном итоге появится в C++ 20 :-) HTTP: // www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0683r1.html –

+0

Возможный дубликат [Бит-поля "Инициализация внутри класса" приводит к ошибке: lvalue, требуемой как левый операнд назначения " ] (https://stackoverflow.com/questions/16520701/bit-fields-in-class-initialization-results-in-error-lvalue-required-as-left) – WorldSEnder

ответ

3

Нет, битовые поля не позволяют инициализатору как часть объявления члена. Вы можете увидеть это в части грамматики, которая описывает членов класса (C++ 11 и более поздних версий, [class.mem]):

member-declarator:
    declarator virt-specifier-seqopt pure-specifieropt
    declarator brace-or-equal-initializeropt
    identifieropt attribute-specifier-seqopt : constant-expression

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

+0

Спасибо! Так что это нужно сделать с кодом. – Vorac

+0

@ Ворак: Да. Если вы не хотите писать предложение, чтобы разрешить инициализаторы для бит-полей. –

3

Вы также можете использовать конструктор для инициализации битовых так:

struct Foo { 
    Foo() : i {15} {} 

    int i : 5; 
}; 

Foo foo; 
cout << foo.i << endl; // 15 

Вы можете видеть, что here

Смежные вопросы