Calls to struct methods and immutable

Dan dbdavidson at yahoo.com
Thu Nov 15 06:00:22 PST 2012


On Thursday, 15 November 2012 at 13:54:10 UTC, Joseph Rushton 
Wakeling wrote:

Make 'void check()' be 'void check() const'
Thanks
Dan
> The following code refuses to compile:
>
> ///////////////////////////////////////////////////////
> import std.math;
>
> struct Foo
> {
>       int a;
>       int b;
>
>       this(int a, int b)
>       {
>             this.a = a;
>             this.b = b;
>       }
>
>       void check()
>       {
>             real c = (a ^^ 2 + b ^^ 2) ^^ 0.5;
>             assert(c < 10);
>       }
> }
>
>
> void main()
> {
>       auto foo = cast(immutable) Foo(3, 4);
>       foo.check();
> }
> ///////////////////////////////////////////////////////
>
> ... producing an error message: immustruct.d(25): Error: 
> function immustruct.Foo.check () is not callable using argument 
> types () immutable
>
> The reason seems pretty evident -- making the instance 
> immutable means that the temporary internal variable c in 
> check() can't be (over)written.  At the same time, this feels a 
> bit daft -- you're talking about a transient value that is 
> never seen outside the function scope.
>
> Is there any way of getting round this constraint so such 
> temporary, transient variables are still permitted within 
> methods of an immutable instance?
>
> As a workaround, if I write a function external to Foo, e.g.
>
> void check2(Foo foo)
> {
>       real c = (foo.a ^^ 2 + foo.b ^^ 2) ^^ 0.5;
>       assert(c < 10);
> }
>
> ... then calling foo.check2() runs without problem.  I'm just 
> curious as to whether it can be done within a struct method too.




More information about the Digitalmars-d-learn mailing list