Parens

Bruce Adams tortoise_74 at yeah.who.co.uk
Sat May 10 07:41:51 PDT 2008


On Sat, 10 May 2008 06:51:21 +0100, Dee Girl <deegirl at noreply.com> wrote:

> Janice Caron Wrote:
>
>> On 10/05/2008, Dee Girl <deegirl at noreply.com> wrote:
>> >  void main(string[] args)
>> >  {
>> >     auto c = new const C;
>> >  }
>> >
>> >  Does not compile. But if I change to const(C) it does compile. It is  
>> a bit unusual that parens make such a big difference. Thank you, Dee  
>> Girl
>>
>> When it comes to parens-version versus non-parens-version, it's not
>> really a problem if one of the two doesn't compile. It would be a
>> bigger problem if both compile, but behave differently.
>>
>> But I agree with you. "new const C" should behave like "new const(C)".
>>
>> However, what you probably should have written is:
>>
>>     const c = new C;
>>
>> because "auto" is what you use in the absence of any other attribute.
>> In this case, it suffices to create a new C, and then assign it to a
>> const-thereafter variable.
>
> I respectfully disagree, Janice-san. The const subject is of big  
> interest to me and I read many times on the website about it. I think in  
> general it is better to write new const(C) but not new C and then use it  
> to assign a const. It is similar to invariant(C) and it is impossible to  
> construct a new C and then assign it to invariant(C) object. In Andres  
> document from ACCU he shows how invariant constructor must know that  
> object being constructed is invariant. And the same a const constructor  
> could know that the object being constructed is const and use that  
> information. Thank you, Dee Girl

It could know and use that but is that really a good idea?
I can imagine a class which had an invariant constructor that set up some  
sort
of mutex to prevent modification whereas its mutable counterpart did not.
I would hate to try and unravel code like that while debugging.
Its the sort of thing only the compier should need to know about.
That being the case the equals is just syntactic sugar like in C++.

const c = new C;

is identically equivalent to

const c(new C);

and:

const c(new const c);




More information about the Digitalmars-d mailing list