On Sun, 08 Mar 2009 06:44:48 +0300, Jason House <[email protected]> 
wrote:

The ugly const thread got me thinking about the old problem of returning an
input while preserving const safety.  I have an idea that seems
reasonable...

In a nutshell, I'm thinking that const(T) should be a base type for T,
immutable(T) and return(T).  return(T) is treated in a read-only fashion,
just like const(T) and immutable(T). Here are some of the key things I think
this achieves:
  * Input arguments are never mutated
* Use of input parameters in calls to functions as const(T) is 100% legal.
  * Temporary variables can legally be defined and used
  * Calling other functions that return return(T) is allowed
  * No code duplication
* No code bloat (compiler only needs to generate one version of the code)
  * Functions can be virtual

Let's take a relatively simple example: max

return(T) max(return(T) a, return(T) b){ return (a>b)?a:b; }

When max is called, the compiler would examine the inputs for a and b to
determine what the true type for return(T) is from the callee's
perspective... So a call with T and immutable(T) would use const(T) as the perceived return type while an argument of T and T would use T as the return
type.

At the call site, the compiler would ensure type safety of how the return
type is used. Within max, the compiler would ensure that the arguments are either treated as const(T) in function calls but not mixed with with types
T, const(T), or immutable(T)

PS: The return(T) notation is an arbitrary one for the purposes of this
post. We need a technical solution before worrying about the color of the
bicycle shed


How about this one?

class Foo {
   T value() {
       return _value;
   }
   T value() const {
       return _value;
   }
}

You suggest turning it into:

return(T) value() {
   return _value;
}

Which is fine but it doesn't say anything about constness of 'this'.

In fact, you propose *exactly* the same thing I've been proposing multiply 
times in past under a different name, though:

sameconst(T) max(sameconst(T) a, sameconst(T) b) {
   return (a > b) ? a : b;
}

class Foo {
   sameconst(T) value() sameconst(this) { // return value has the same 
constness as 'this' (mutable, const or immutable)
       return _value;
   }
}

The constness is automatically propogated based on parameters. For example,
- sameconst(T) == T if all the parameters are mutable
- sameconst(T) == immutable(T) if all the parameters are immutable
- sameconst(T) == const(T) otherwise



Reply via email to