On Wednesday, 29 August 2012 at 03:21:04 UTC, Jonathan M Davis wrote:
>> > void main()
>> > {
>> > >> > immutable(Test)* ptr = new immutable(Test);
>> >     ptr.foo();
>> > >> > } >> >> Now, that's a surprise for someone coming from C++. But even >> though ptr looks like a reference variable in your example, >> it > >> doesn't look like it at all in this example:
> I've been primarily a D guy for years, and even I'm surprised
> by that!
> O_O

You didn't know that the dot operator does dereference? That's
quite a big one to miss for years.

Yeah. I'm a bit confused about what's so suprising about that code.

- Jonathan M Davis

The weird thing is that you can use a member access operator with a pointer (without explicitly dereferencing the pointer first). At least I didn't know what to expect the following code to print:

struct MyStruct
{
    int _value = 0;

    void increment()
    {
        ++_value;
    }
}

void increment(ref MyStruct* ptr)
{
    ++ptr;
}

void main()
{
    MyStruct[2] twoStructs;
    twoStructs[1]._value = 42;

    MyStruct* ptrFirstStruct = &twoStructs[0];

    // Are we incrementing the pointer using UFCS or
    // are we calling the member function in MyStruct?
    ptrFirstStruct.increment();

    // This prints 1, so we called the actual method
    writeln((*ptrFirstStruct)._value);
}

Reply via email to