opCast + dtor error

Tejas notrealemail at gmail.com
Wed Dec 29 01:00:53 UTC 2021


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


}
```


More information about the Digitalmars-d-learn mailing list