2014-11-21 161 views
1

在C++ 11人能做到默认值位域元素

struct S {int i = 42;}; 

,每当一个忘了初始化成员,我,它 得到默认初始化为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 – 2017-12-09 10:24:16

+0

[Bit-fields“In-class initialization”可能重复会导致“错误:作为赋值左操作数所需的左值” ](https://stackoverflow.com/questions/16520701/bit-fields-in-class-initialization-results-in-error-lvalue-required-as-left) – WorldSEnder 2018-02-15 13:24:27

回答

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 2014-11-21 09:33:54

+0

@Vorac:是的。除非你想写一个提案来允许位字段的初始化。 – 2014-11-21 09:35:15

3

你也可以使用一个构造函数来初始化这样的位域:

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

    int i : 5; 
}; 

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

你可以看到它here