在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