const vs immutable for local variables

Steven Schveighoffer schveiguy at yahoo.com
Thu Nov 18 11:43:57 PST 2010


On Thu, 18 Nov 2010 14:30:34 -0500, spir <denis.spir at gmail.com> wrote:

> On Thu, 18 Nov 2010 07:50:51 -0500
> "Steven Schveighoffer" <schveiguy at yahoo.com> wrote:
>
>> On Wed, 17 Nov 2010 23:41:33 -0500, Jonathan M Davis  
>> <jmdavisProg at gmx.com>
>> wrote:
>>
>> > In C++, I tend to declare all local variables const when I know that
>> > they aren't
>> > going to need to be altered. I'd like to something similar in D.
>> > However, D has
>> > both const and immutable. I can see clear differences in how const and
>> > immutable
>> > work with regards to function parameters and member variables, but  
>> it's
>> > not as
>> > clear with regards to const and immutable.
>>
>> immutable and const storage classes are identical as far as the compiler
>> is concerned (neither can ever be changed).  However, immutable gives  
>> more
>> guarantees as a type modifier.  I'd recommend immutable, because it's a
>> specialization, and while the compiler can know that in a current  
>> function
>> a const value is really immutable, it can't pass that knowledge to other
>> functions.
>>
>> For example, a function may be overloaded on both const and immutable
>> because the immutable one can make more assumptions.  If you declare  
>> your
>> variable const and call the function with your variable as the  
>> parameter,
>> then it calls the const version, even though the data is really
>> immutable.  You lose out on some possible optimizations.
>>
>> Also, pure functions that take immutable can be 'strongly pure' so can  
>> be
>> better optimized.
>>
>> All this is moot of course if your variable is a value type :)  But I'd
>> still recommend immutable even in those cases because the definition is
>> clearer -- immutable data can never change, it is assumed that const  
>> data
>> can change, but in your case, it will never change.  If nothing else, it
>> conveys the most accurate information to the reader of the code.
>
> Does all the thread finally mean that const is relative to variables,  
> while immutable is (as in FP) relative to elements (be them values or  
> referenced thingies)?

const applied to a value type means the same thing as immutable.  For  
example:

const int i;
immutable int i;

both say the same thing -- i will never change.

const applied to a *reference* type means that you cannot change that data  
*through that reference*, but it may change through another reference.

For example:

int i;
const int *j = &i;

I can change i, but not through j.

immutable applied to a reference type means that *nobody* can change that  
data through any reference.  It is safe to assume it never changes.

For example:

int i;
immutable int j;
immutable int *ip = &i; // Error!
immutable int *jp = &j; // OK

So while immutable and const are basically equivalent on value types (as  
was the original question), it's more 'correct' IMO to declare them as  
immutable because of the meaning of immutable -- this will never change,  
no matter what.

-Steve


More information about the Digitalmars-d-learn mailing list