2014-11-21 130 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