Static member function returning immutable slice; compiler error: without this cannot be immutable

Ali Çehreli acehreli at yahoo.com
Fri Jul 6 01:44:24 UTC 2018


On 07/05/2018 01:00 PM, ag0aep6g wrote:

 > `immutable` means that the data can't ever change. Not even the owning
 > Foo is allowed to change it. If you want to disallow changes from
 > outside, but still allow the owning Foo to make changes, use `const`:
 >
 >      static const(Foo[]) getFooList()

To add, in that context 'immutable' would be a guarantee to the outside 
world: "I will never change this data." On the other hand, 'const' means 
"Dear compiler, please make sure the caller does not mutate this data."

However, I think the return type would be more useful as const(Foo)[] to 
let the caller to be able to add elements to their local copy of the slice:

struct Foo {
}

Foo[] foos;

// const(Foo[]) would not allow the concatenation in main.
const(Foo)[] getFooList() {
     return foos;
}

void main() {
     auto f = getFooList();
     f ~= Foo();
}

But then one might argue that if the caller would concatenate anyway, 
which would cause memory allocation and copying, wouldn't the caller 
better use .dup to get a mutable copy of the elements.

     auto f = getFooList().dup;
     f ~= Foo();

I don't know... Too much analysis... :)

Ali



More information about the Digitalmars-d-learn mailing list