Meaning of const

H. S. Teoh hsteoh at quickfur.ath.cx
Tue Jan 24 17:29:49 PST 2012


On Tue, Jan 24, 2012 at 08:01:41PM -0500, bearophile wrote:
> Jonathan M Davis:
> 
> > Now, the confusing part is the fact that unlike C++, D allows you to put the 
> > const for making the function on the _left-hand_ side of the function (C++ 
> > only lets you put it on the right). This is to increase consistency between 
> > modifers (public, override, pure, etc.) - they _all_ can go on both the right 
> > and left (which is very unfortunate in the case of const and immutable IMHO). 
> > That means that const (and immutable) always modify the function rather than 
> > the return value unless you use parens.
> 
> Some time ago we have discussed this topic in an enhancement request in Bugzilla. The idea was to disallow code like:
> 
> 
> struct Foo {
>     int x;
>     const const(int) bar() {
>         return 0;
>     }
> }
> void main() {}
> 
> 
> and require the struct "const", "immutable" to be only on the right if present.
> Walter shot this idea down for consistency. But I generally don't want
> consistency when it's just a potential source of confusion for the
> programmer :-)
[...]

How can this be consistency? For example:

	class A {
		const int x;
		@property const int y();
	}

Now you have typeof(A.x)==const(int) and typeof(A.y)==int. Seems quite
inconsistent to me.

But since Walter doesn't like the idea of restricting the syntax to 'int
y() const', then what about making it mandatory to write:

	const(int) x;

instead of:

	const int x;

?

Requiring the parentheses is a bit extreme, I admit, but it touches upon
another area of D syntax that I don't quite like, and that is const or
immutable applied to arrays:

	const(int)[] x;		// array of const(int)
	const(int[]) x;		// const array of int
	const int[] x;		// ??? const array of const int? Or one
				// of the above?

It gets worse when you throw in ref:

	ref int f();		// returns int* (I think?)
	ref const(int) f();	// returns const(int)* (?)
	ref const int f();	// ???
	const ref int f():	// ???

The last line is quite bad. Is the return type const(int*) or
const(int)*, or is it just int* (i.e., const applies to f not the return
value)?

	ref const(int)[] x;	// ref to array of const(int)?
	const(ref int)[] x;	// array of refs to int?
	const ref int[] x;	// array of ???
	const ref int[] x();	// const function that returns ref int[]?
	const const ref int[] x();	// const function returning what?

The more I think about this, the more confusing it becomes. If
parentheses were mandatory after const, things would be much, much
better:

	const(ref int) x;
	const(ref const(int)) x;
	... etc.

Much clearer to me.


T

-- 
You have to expect the unexpected. -- RL


More information about the Digitalmars-d-learn mailing list