View mode: basic / threaded / horizontal-split · Log in · Help
June 22, 2012
immutable ref foreach on values
Is this expected and good?


void main() {
    int[] array = [1, 2];
    foreach (ref const(int) x; array) {} // OK
    foreach (ref immutable(int) x; array) {} // error
}


DMD 2.060alpha:
temp.d(4): Error: argument type mismatch, int to ref 
immutable(int)

Thank you,
bye,
bearophile
June 22, 2012
Re: immutable ref foreach on values
On Friday, 22 June 2012 at 11:07:14 UTC, bearophile wrote:
> Is this expected and good?
>
>
> void main() {
>     int[] array = [1, 2];
>     foreach (ref const(int) x; array) {} // OK
>     foreach (ref immutable(int) x; array) {} // error
> }
>
>
> DMD 2.060alpha:
> temp.d(4): Error: argument type mismatch, int to ref 
> immutable(int)
>
> Thank you,
> bye,
> bearophile

I think it's good. In this special case, the compiler can see 
that you can't change array behind his back. That seems not to be 
true in general.
June 22, 2012
Re: immutable ref foreach on values
Tobias Pankrath:

> I think it's good. In this special case, the compiler can see 
> that you can't change array behind his back. That seems not to 
> be true in general.

But aren't int implicitly castable to immutable?

Bye,
bearophile
June 22, 2012
Re: immutable ref foreach on values
On 22-Jun-12 16:16, bearophile wrote:
> Tobias Pankrath:
>
>> I think it's good. In this special case, the compiler can see that you
>> can't change array behind his back. That seems not to be true in general.
>
> But aren't int implicitly castable to immutable?
>

then every array is implicitly castable to tail immutable.
int[] array = [1, 2];

    foreach (ref immutable(int) x; array) {
	...
	func(arr); // arr is mutable, thus func can change x
	// so x can be at most  const
    }

-- 
Dmitry Olshansky
June 22, 2012
Re: immutable ref foreach on values
Dmitry Olshansky:

> then every array is implicitly castable to tail immutable.
> int[] array = [1, 2];
>
>     foreach (ref immutable(int) x; array) {
> 	...
> 	func(arr); // arr is mutable, thus func can change x
> 	// so x can be at most  const
>     }

I understand, thank you :-)

Bye,
bearophile
Top | Discussion index | About this forum | D home