On Monday, 9 February 2015 at 10:56:31 UTC, Dicebot wrote:
Doing a lot of porting from D1 to D2 recently I have realized that we still don't have any idiomatic way to express function result types that can be both mutable and immutable.

Consider this trivial snippet:

```D
import std.array : join;

void main()
{
        auto s = join([ "aaa", "bbb", "ccc" ]);
        pragma(msg, typeof(s));
}
```

It outputs "string" which stands for immutable buffer. However, actual allocated buffer is not yet truly immutable - it has just been allocated to hold the result of join algorithm and may be interpreted both as mutable and immutable, depending on caller desire.

In this specific case if caller wanted to get a mutable buffer instead, it would need to do cast from immutable which is very dangerous - especially considering implementation of `join` may change. And doing .dup on buffer that has just been allocated is quite a waste.

Right now I am leaning towards personal convention to always return mutable or const buffers and do assumeUnique at caller side where necessary. But this does, of course, suck.

What is current conventional wisdom on topic? Can we probably start using std.typecons.Unique for such functions?

Someone is starting to see where I'm getting at when I'm pushing for owned...

Reply via email to