在C++ 11人能做到默认值位域元素
struct S {int i = 42;};
,每当一个忘了初始化成员,我,它 得到默认初始化为42.我只是 位字段作为
试过这种struct S {int i = 42 : 5;};
和我得到
error: expected ';' before ':' token
这是否FEA位域成员是否存在,如果是这样,我该如何使用它?
在C++ 11人能做到默认值位域元素
struct S {int i = 42;};
,每当一个忘了初始化成员,我,它 得到默认初始化为42.我只是 位字段作为
试过这种struct S {int i = 42 : 5;};
和我得到
error: expected ';' before ':' token
这是否FEA位域成员是否存在,如果是这样,我该如何使用它?
不,位域不允许初始化器作为成员声明的一部分。可以在描述类成员(C++ 11以后,[class.mem])的语法的一部分看到这一点:
member-declarator:
declarator virt-specifier-seqopt pure-specifieropt
declarator brace-or-equal-initializeropt
identifieropt attribute-specifier-seqopt : constant-expression
第三种形式为位字段声明的语法,但只有第二种形式列出了括号或相等初始值设定程序。
谢谢!所以它必须用代码来完成。 – Vorac 2014-11-21 09:33:54
@Vorac:是的。除非你想写一个提案来允许位字段的初始化。 – 2014-11-21 09:35:15
你也可以使用一个构造函数来初始化这样的位域:
struct Foo {
Foo() : i {15} {}
int i : 5;
};
Foo foo;
cout << foo.i << endl; // 15
你可以看到它here
好像它最终会出现在C++ 20 :-) HTTP:// www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0683r1.html – 2017-12-09 10:24:16
[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