On Wednesday, 9 August 2017 at 12:47:49 UTC, Steven Schveighoffer wrote:
On 8/8/17 3:59 PM, Johan Engelen wrote:

In C++, it is clear that the _caller_ is doing the dereferencing, and the dereference is also explicit.

In fact it's not doing any dereferencing. It's just under the hood passing a pointer.

Come on Steven, I thought you knew I am a compiler dev.

The caller _is_ doing dereferencing. That's what the '*' means semantically and it matters. [1]

However, the in contract does actually enforce the requirement.

And adds null pointer checks even when clearly not needed.

Clearly not needed? I thought the point was to ensure the reference is not null?

I meant code like this: `k->something(); foo(*k);` or `auto k = new Klass(); foo(*k);`.

Anyway, the point was to express the intent nicely.
I wasn't expecting having to explain the merits of passing by reference.

- Johan

[1] Going off-topic.
The alternative is dereferencing inside the callee (which is apparently the only option D semantically provides for classes). I showed the impact of this semantic difference in my DConf 2017 talk; here are links to examples:
https://godbolt.org/g/rgvHTC  (C++)
https://godbolt.org/g/NCTeXo  (D)
It's a pity we are not able to pass classes "by reference" (per C++ parlance), for reasoning and readability, and performance. I still have to come up with a rationale for not having an explicit "*" for classes for when I am going to teach D.

Reply via email to