On Monday, 3 September 2012 at 21:18:28 UTC, Carl Sturtivant wrote:
On Monday, 3 September 2012 at 12:12:46 UTC, monarch_dodra wrote:
[SNIP]

In a nutshell, I think you're broadly saying that you want to program with a struct S the same way whether it's stack or heap allocated. (Good code reuse, and no duplication of semantics with -> as in C++.) From this perspective the trouble is that "S()" and "new S()" don't have the same effect except for allocating one on the stack and one on the heap, and the language forbids you from overcoming this via reference variables, except by calling a function and passing "*r" to a "ref S" parameter.

[SNIP]

Yeah, in a nut shell, that is pretty much it. There are several ways to "work around it", but, IMO, none are good enough: *Function with ref: Too intrusive, especially for more complicated functions. *Structs that implicitly alias This (such as RefCounted): Ref Counted itself I'm not a huge fan of, since I don't see why I'd pay for RAII when I have a GC. As for the rest, it is not in the library, so I wouldn't want to roll one out myself. **Furthermore, these wrapper structs have a way of "tainting" the type system: When you pass your struct to a template, the template will instantiate on your struct itself, and not on the wrapped type. *structs with explicit dereference (those that have "get", for instance): That's just trading "*" for "get".

For now, I'll just (*s) it. It isn't broken or anything...

----

What I regret though, is that since D is Garbage Collected, it is just screaming to be able to write:
----
S& val = *(new S);
val.doSomthing();
doSomething(s);
...
----
This is legal in C++, but it leaks* :/ D should be able to harness such expressiveness with no problems whatsoever though.

*Actually, I've done this in C++ for classes that have hefty attributes that need to be allocated, but otherwise don't need pointer functionalities. You just have to make sure to correctly implement the CC to avoid aliasing, and to "delete &val;" in the destructor. Once you've done this though, then for all intents and purposes, "val" is a value attribute. Nifty.

Reply via email to