this() not executing code on structs

grauzone none at example.net
Wed Oct 21 14:54:08 PDT 2009


Andrei Alexandrescu wrote:
> Today, structs can't write their own this(). There aren't very solid 
> reasons for that except that it makes language implementation more 
> difficult.
> 
> I wonder how much of a problem that could be in practice. I realized 
> today that the "Counted" example - a classic C++ primer example 
> featuring a struct that counts its own instances - cannot be implemented 
> in D.
> 
> In C++ the counted example looks like this:
> 
> struct Counted {
>    static unsigned count;
>    unsigned myCount;
>    Counted() { myCount = count++; }
>    Counted(const Counted& rhs) { myCount = count++; }
>    Counted& operator=(const Counted& rhs) {
>       // no writing to myCount
>       return *this;
>    }
>    ~Counted() {
>       --count;
>    }
> }
> 
> In D there's no chance to write Counted because you can always create 
> Counted objects without executing any code.
> 
> struct Counted {
>    static uint count;
>    uint myCount;
>    this() { myCount = count++; }       // ERROR
>    this(this) { myCount = count++; }
>    ref Counted opAssign(Counted rhs) {
>       // no writing to myCount
>       return this;
>    }
>    ~this() {
>       --count;
>    }
> }
> 
> This being a toy example, I wonder whether there are much more serious 
> examples that would be impossible to implement within D.

I'd really like to know why "scope x = new X();" is "unsafe", while 
encouraging doing exactly the same with structs seems to be a perfectly 
fine idea. Allocating structs on the stack is obviously not any safer 
than with classes. I don't remember the exact reasons why you wanted to 
turn "scope" into a library feature, but I think I remember something 
about discouraging it for safety reasons; please forgive me is this is 
wrong.

Why do you want to add class functionality to structs to enable "RAII" 
like features, when you could just use scope classes?

To refresh everyone's memory: a scope class is declared like "scope 
class Foo { ... }", and references to it can "only appear as a function 
local variable".

I for one don't really like the idea of having to distinguish between 
PODs and "other stuff" (like you had in C++) just again.

At the very least, the default constructor should always be available 
for structs. (If not, have fun figuring out what S[10] should do.)

> Andrei



More information about the Digitalmars-d mailing list