On Tuesday, 28 December 2021 at 18:27:36 UTC, vit wrote:
Hi, why this code doesn't compile?

```d
struct Foo{
    bool opCast(T : bool)()const{
        assert(0);
    }

    ~this(){}
}

struct Bar{
    const Foo foo;
}

void main(){


}
```

Error: template instance `opCast!(Foo)` does not match template declaration `opCast(T : bool)()`

Since a destructor ignores `const`, I think adding the `~this` to Foo manually is somehow making the compiler have to actually cast away const, which it is doing via `cast(Foo) foo`, which fails since you've declared your own `opCast` that only accepts arguments implicitly convertible to `bool`.

I say this because removing the specialisation in `opCast` and changing the return type of it to `Foo` works :

```d
struct Foo{
    Foo opCast(T)()const {
        assert(0);
        return this;
    }
    ~this() {}

}

struct Bar{
    const Foo foo;

}

void main(){
    //Bar bar = Bar(); //this will trigger the assertion failure


}
```

Reply via email to