On Sunday, 15 May 2022 at 20:05:05 UTC, Kevin Bailey wrote:


One question is, how should we pass objects - by value or by reference? In C++, you can do either, of course, but you take your chances if you pass by value - both in safety AND PERFORMANCE. The bottom line is that no one passes by value, even for PODs (although we may return even large objects.)

Pass struct instances by ref or by value as needed, just as you do in C++.

For classes, you never have direct access to the instance. Your class reference is a handle (a pointer) that is always passed by value.


But I asked a different question: Why can't I put a class object on the stack? What's the danger?

I answered that one. You can put a class on the stack with `scope`. There is no danger in that.

If you're wanting direct access to the class instance, like you would have with a struct, you don't have that in D. Classes are modeled on Java, not C++.


Note that operating on that object hasn't changed. If I pass by reference, it's no different than if I had created a reference.

Again, you never have direct access to the object instance. You always access it through the handle.


One might say, Well, if D creates by value, then it has to pass by value. But it doesn't; it has the 'ref' keyword.

Everything is passed by value unless the `ref` keyword is present.


One might want to avoid passing by value accidentally. Ok, one could have D pass class objects by reference implicitly.

How do you pass by value accidentally? By forgetting the `ref` keyword?


I don't like things silently changing like that, so one might have D forbid all but pass by 'ref' or pointer for class objects.

I don't understand where you're coming from here. How can things silently change?


I hope Ali's answer isn't the real reason. I would be sad if D risked seg faults just to make class behavior "consistent".


Where is the risk of seg faults? Are you referring to the fact that class references are default initialized to null?


Reply via email to