On Wednesday, 31 August 2016 at 10:12:21 UTC, Johannes Pfau wrote:

There was @disable this(this)
This prevents to use a location as argument to a function, like: print(timer.count). Is there any reason to have this line or not?

I guess timer is a (enum) pointer to a struct and count is a Volatile!T
field in that struct?
Yes

But then timer.count does not return a address, it returns the value of count? Unless of course print(X) takes its argument by ref or alias.
I want to use them just by value.


The reason for @disable this(this) is to disable copying of the struct. The compiler otherwise accesses T raw in a 'non-volatile' way when copying the value. In D we can only have a postblit function, but we cannot reimplement the copying. opAssign can only be used in some cases:
    Foo f;
    auto f2 = Foo();
    auto f3 = f2;
    f = Foo();
    f = f2;

Only the last two lines call opAssign. So "auto f3 = f2" could copy a Volatile!T in a non-volatile way. This is the reason for @disable this(this), AFAIK.

I think I somehow get the point even if I do not fully understand the explanation. But it is too restrictive if I always need to have a getter function or assign the value first to a temporary variable to use the value in a function call.

Anyway, I think it is a gdc bug that the error message comes from the called function that has nothing to do with this. The error should show the function call where the disabled copy operation is.

Reply via email to