www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - immutable ref foreach on values

reply "bearophile" <bearophileHUGS lycos.com> writes:
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
Jun 22 2012
parent reply "Tobias Pankrath" <tobias pankrath.net> writes:
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.
Jun 22 2012
parent reply "bearophile" <bearophileHUGS lycos.com> writes:
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
Jun 22 2012
parent reply Dmitry Olshansky <dmitry.olsh gmail.com> writes:
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
Jun 22 2012
parent "bearophile" <bearophileHUGS lycos.com> writes:
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
Jun 22 2012