On 8/1/17 6:50 PM, H. S. Teoh via Digitalmars-d-learn wrote:
On Tue, Aug 01, 2017 at 10:04:18AM -0400, Steven Schveighoffer via
Digitalmars-d-learn wrote:
On 7/30/17 12:19 AM, Matthew Gamble wrote:
[...]
import std.array;
import std.algorithm;
class A
{
this() { aa = ["a":1, "b" : 2, "c" : 3]; }
auto pairs() @property const { return
aa.byPair.array.sort().release; }
private:
int[string] aa;
}
If I remove const from the pairs function it compiles fine. I'm just
not sure this is a behavior I want. Any help/recommendation would be
appreciated.
byPair must store a pointer to the data in the AA. If you mark the AA
const, then it must store a const pointer to AA data.
[...]
Actually, there's nothing about the implementation of both byKeyValue
(the underlying implementation in druntime) and byPair in std.array that
would preclude them from being used with const AA's. The only flaw is
that the declaration of byPair doesn't match const AA's:
https://issues.dlang.org/show_bug.cgi?id=17711
Here's the fix:
https://github.com/dlang/phobos/pull/5668
It works, because the byKeyValue implementation is so... ugly.
For instance this:
return Result(_aaRange(cast(void*)aa));
Just throws away all const/mutability. However, the Pair struct inside
restores the correct modifiers. I hope...
If this were a true implementation without the opaqueness, it would not
work properly.
-Steve