initializer list like in C++?

Chris Nicholson-Sauls ibisbasenji at gmail.com
Tue Jul 24 13:47:28 PDT 2007


James Dennett wrote:
> BCS wrote:
>> Reply to James,
>>
>>> Jarrett Billingsley wrote:
>>>
>>>> "Hoenir" <mrmocool at gmx.de> wrote in message
>>>> news:f84rnt$1db0$1 at digitalmars.com...
>>>>
>>>>> Is there anything like the initializer list (C++) in D?
>>>>>
>>>>> class Test {
>>>>> int x;
>>>>> Test(int y):x(y){};
>>>>> }
>>>> No.  See
>>>> http://www.digitalmars.com/d/archives/digitalmars/D/initialization_li
>>>> sts_55262.html for an explanation on why D doesn't have them.
>>>>
>>> I looked at that thread, but found only references to performance,
>>> which miss the main reason why these are present/useful in C++:
>>> semantics.  There are various kinds of things in C++ that can be
>>> initialized but cannot be modified, because of references, const-ness,
>>> and classes with immutable value semantics.
>>>
>>> The occasional/slight performance benefit is definitely secondary to
>>> the ability to express meaning directly in the code.
>>>
>>> As D gains the ability to model such immutable members, it might
>>> benefit from finding (its own) solution to the same issue.
>>>
>> IIRC  this works
>>
>> const int i;
>> static this(){i=5;}
>>
>> class C
>> {
>>   const char c;
>>   this(char c_){c=c_;}
>> }
> 
> Can c be modified more than once during construction?  If not,
> what rules are used to determine when it's been modified?
> 
> Java came up with "definite assignment" rules for this kind of
> things, and they're pretty decent -- they guarantee that a final
> value is assigned a value exactly once, while allowing for some
> flexibility such as setting it down all branches of an if/else.
> 
> -- James

As I understand it:

=== D/1.x ===
Const fields/variables can be assigned and otherwise modified freely 
within relevant constructors, being otherwise iron-clad.  I believe its 
a compile-time check only, with available hardware protections at runtime.

=== D/2.x ===
Final fields/variables are assign-once, from anywhere, with some check 
bit being set thereafter to prevent rebinding.  Const takes on a meaning 
relevant to the actual data only, and so means nothing for the 
discussion at hand.  (I may be wrong; for example, it may be that 
constructors specifically take liberties with 2.x final as they do with 
1.x const.)

-- Chris Nicholson-Sauls


More information about the Digitalmars-d-learn mailing list