const debacle

Steven Schveighoffer schveiguy at yahoo.com
Mon Mar 24 10:59:59 PDT 2008


"Janice Caron" wrote
> On 24/03/2008, Steven Schveighoffer wrote:
>> No, it is not a solved problem.  As a caller of a function, you still 
>> cannot
>>  rely on the compiler verifying that a function does not modify it's
>>  arguments for mutable arguments.
>
> I don't follow that. I believe that at least two of the three
> solutions do indeed make that guarantee.
>
> Solution 2: Explicit cast
>
>    T strchr(T)(const T s, char c)
>    {
>        return cast(T)(whatever);
>    }
>
> The declaration of s as "const T" guarantees that the function body
> will not modify s.
>

This does not solve the problem, as if I pass a const T to the function, it 
violates const correctness, just like the C version did.

> Solution 3: Return a range
>
>    Range!(uint) strchr(const(char)[] s, char c)
>
> The declaration of s as "const(char)[]" guarantees that the function
> body will not modify the elements of s.

I don't consider this to be a solution because you must implement part of 
the function every time you call it.  Here is a better case:

T min(T)(T firstval, T secondval)
{
  return firstval < secondval ? firstval : secondval;
}

This should have const on firstval and secondval, even if T is a mutable 
type, but because of the current const rules, it can't.  As a user of min, I 
am still forced to read the implementation of the function, or trust the 
implementor of the function to have done what he says it does (and for 
him/her to have checked all the functions he might call).  I'd much rather 
trust the compiler, and not worry about it.

Yes, you could rewrite the function as:

bool less(T)(const(T) firstval, const(T) secondval)
{
   return firstval < secondval;
}

// x = min(x, y);
x = less(x, y) ? x : y;

Now this function is totally useless as I can rewrite it as:

x = x < y ? x : y;

I don't like this general design idea because the caller must know how to 
build the 'real' result based on the parameters given back, and basically 
must re-implement some or all of the function every time he/she calls it. 
There are more abstract cases too, that you would almost have to return a 
delegate, and have the user call the delegate on the parameter again!  Think 
of how awful implementing such a function would be.  I'd much rather have 
the function itself construct the result in the way it wants to, then tell 
the caller how to construct it.

-Steve 





More information about the Digitalmars-d mailing list