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