Structs with pointers?

Mafi mafi at example.org
Sun Jan 23 08:05:05 PST 2011


Am 23.01.2011 11:00, schrieb Dmitry Olshansky:
> On 23.01.2011 2:02, bearophile wrote:
>>> Is this another compiler bug?
>> The situation is nice:
>>
>> struct Foo1 {}
>> struct Foo2 { int x; }
>> const struct Foo3 { int* p; }
>> struct Foo4 { int* p; }
>> void bar1(Foo1 f) {}
>> void bar2(Foo2 f) {}
>> void bar3(Foo3 f) {}
>> void bar4(Foo4 f) {}
>> void main() {
>> const f1 = Foo1();
>> bar1(f1); // no error
>> const f2 = Foo2();
>> bar2(f2); // no error
>> const f3 = Foo3();
>> bar3(f3); // no error
>> const f4 = Foo4();
>> bar4(f4); // error
>> }
>>
>> Bye,
>> bearophile
>
> The first two are actually OK, since you pass a copy of a value type
> FooX to barX.
> If signature was void bar(ref FooX) then it should have failed.
> But the third makes me wonder what the *** is going on.
>

I think it's absolutely correct. Look: Foo3 is declared as const struct 
meaning all it's members are const. We are passing a struct like that to 
bar3:
  const Foo3 { const int* p}
which is implicitely converted to:
  Foo3 { const int* p } //not ref !!
Because it's not ref you can't manipulate the original struct anyways 
and the pointer is still const. As long as you don't cast you cannot 
change what the pointer points to so this implicit conversion is correct 
IMO.
It's like const(T[]) => const(T)[] .

Mafi


More information about the Digitalmars-d-learn mailing list