Class member variable initialization vs. C++ initializer lists, and weirder classes

Evan evaned at gmail.com
Thu May 10 19:13:20 UTC 2018


A discussion came up on Reddit about C++'s initializer lists, and 
I realized I didn't really know what other languages in the same 
space do for member initialization. I'm not looking to start a 
language war here; I'm asking out of curiosity/general knowledge.

I found a prior discussion on what D does [1], and I think the 
most relevant part is this (reduced slightly from the original):

>    class MyClass {
>        int d = 6;
> 
>        this(int val) {
>            d = val;
>        }
>    }
>
>
> You are correct that in the case of the [...] constructor,
> two assignments effectively take place, d = 6, then d = 7.


In C++ terms, I would describe this as "d is first initialized to 
6, and then assigned to from 7".

However, if that's the only mechanism for "initializing" a class 
variable it seems to me like this would cause problems with:

* Classes that can't be default-initialized because they need 
some data to be provided
   not known until runtime and it is desired that there not be a 
way to construct an
   "empty" object; something like this C++:

     class Person {
        string name;

        // no Person() provided
        Person(string n) { n = name; } // not "idiomatic c++", but 
works
     };

     class EmployeeRecord {
        Person person;

        // no this() provided
        EmployeeRecord(string name) : person(name) {} // no way to 
*not* use init-list
     };

* Classes that can't be assigned. I'm having a harder time coming 
up with a good
   example here that would usefully be a member of another class, 
but some RAII
   objects could fit the bill. (For example, std::lock_guard is 
not copyable or
   assignable.)


How would these be handled in D? Do these concepts exist in some 
form? If so, how would you initialize them?

Evan


[1] https://forum.dlang.org/thread/jg9ajr$1iaq$1@digitalmars.com


More information about the Digitalmars-d mailing list