What is the difference between...

Bruno Medeiros brunodomedeiros+spam at com.gmail
Fri Sep 7 12:56:24 PDT 2007


Sean Kelly wrote:
> Bruno Medeiros wrote:
>> Sean Kelly wrote:
>>> Bruno Medeiros wrote:
>>>> Janice Caron wrote:
>>>>> -----Original Message-----
>>>>> From: digitalmars-d-bounces at puremagic.com 
>>>>> [mailto:digitalmars-d-bounces at puremagic.com] On Behalf Of Daniel919
>>>>> Sent: 07 September 2007 12:39
>>>>> To: digitalmars-d at puremagic.com
>>>>> Subject: Re: What is the difference between...
>>>>>
>>>>>> > (2) void f(const(int) x)
>>>>>> Useless, like all: const/invariant(simplestoragetype)
>>>>>
>>>>> It is? Why? Why doesn't it mean x is a const int?
>>>>>
>>>>> So f(const(int)* x) means x is a pointer to const int, but 
>>>>> f(const(int) x) does not mean x is a const int? Now I'm very, very 
>>>>> confused.
>>>>>
>>>>> Why am I not getting this?
>>>>>
>>>>
>>>> const(...) makes everything inside the parenthesis const. But there 
>>>> is one exception: If that const is part of a declaration, then the 
>>>> top-level value/type is not const. (the top-level value is the one 
>>>> that changes with assignments) So:
>>>>
>>>> const(int)* x;  // mutable pointer to const int
>>>> const(int)  x;  // mutable int;
>>>> const(int*) x;  // mutable pointer to const int
>>>> const(int**) x;  // mutable pointer to const pointer to const int;
>>>> const(int*)* x;  // mutable pointer to const pointer to const int;
>>>
>>> Wouldn't this be "mutable pointer to mutable pointer to const int?"
>>>
>>>
>>> Sean
>>
>> The last one :
>>   const(int*)* x;
>> ?
>>
>> Nope, it's like I said.
> 
> So the "top-level value/type" rule you mention above applies to the 
> entire type rather than just the bit in parenthesis? 

Yes, if by "entire type" we mean the type of a declarations (and of 
typeofs too).

> Then there is 
> effectively no difference between "const(int**) x" and "const(int*)*" 
> correct? 

Nope.

> So why are both syntaxes accepted?
> 
> 
> Sean

I would *guess* it's so you have a way to declare a mutable class 
(reference) that refers to immutable class data. I.e.:
   const(Foo) foo;
then 'foo = xpto' is allowed, but 'foo.x = xpto' is not.
If const(<X>) were to work without that exception rule, then there would 
be no way to declare something like the above. For pointers you could do:
  const(int)* x;
but for classes, there would be no syntax.

But one would have to ask Walter to know for sure.
Was any of this discussed at the conference? This 'head'/'tail' Robert 
has been mentioned seems related. Seems the term 'head' is the same as 
'top-level value'.

-- 
Bruno Medeiros - MSc in CS/E student
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D



More information about the Digitalmars-d mailing list