On Thursday, 22 October 2020 at 21:55:59 UTC, Jack Applegame wrote:
There is a funny feature (or bug) in the D language:

static alias this and static operator overloading.

For example

interface Foo {
    static {
        int value;
        void opAssign(int v) { value = v; }
        int get() { return value; }
        alias get this;
    }
}

Now we can use type Foo as if it were an lvalue/rvalue:

Foo = 5;
int a = Foo;
int b = Foo + a;

I heavily use this feature in my MCU library.

It doesn't surprise me that much. What actually did was that static opIndex() works. Consider this:

    struct X
    {
        static int opIndex() { return 1; }
    }

    alias SliceOf(T) = T[];
    enum ValueOf(T) = T[];

    static assert( ! is(int[SliceOf!X] == int[ValueOf!X]));

But static opIndex and friends can be useful: https://run.dlang.io/is/s15zS0 I'd actually find it awesome if we had opCallAssign and opCallOpAssign; the reason I used opIndex and not opCall is that way, one gets access to the right-hand side and to-assign parameters by reference, so no internal pointer stuff's needed.

But it doesn't work inside conditionals:

if(Foo) {}    // Error: type Foo is not an expression
while(Foo) {} // Error: type Foo is not an expression

Even if we define `static opCast!bool()`. It doesn't help.

Only using Foo.opCast!bool works; cast(bool) won't compile.

Should this be fixed?

The bool stuff should be fixed. The other direction would be a breaking change.

Reply via email to