[Issue 14625] New: opIndex() doesn't work on foreach container iteration
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Wed May 27 20:57:02 PDT 2015
https://issues.dlang.org/show_bug.cgi?id=14625
Issue ID: 14625
Summary: opIndex() doesn't work on foreach container iteration
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Keywords: rejects-valid
Severity: normal
Priority: P1
Component: DMD
Assignee: nobody at puremagic.com
Reporter: k.hara.pg at gmail.com
A non-range container object iteration `foreach (e; c)` is
implicitly converted to a range iteration, by application of
implicit slicing like as `foreach (e; c[])`.
(Maybe the feature is not well documented in website?
http://dlang.org/statement#foreach-with-ranges
)
struct Range
{
@property bool empty() { return true; }
@property int front() { return 0; }
void popFront() {}
}
struct Container
{
Range opSlice() { return Range(); }
}
void main()
{
Container c;
foreach (e; c) {}
}
On the other hand, new integrated array operator overloading says as follows:
http://dlang.org/operatoroverloading#Slice
> To overload a[], simply define opIndex with no parameters:
But, it does not work on the container iteration. Test case is:
// Range struct is same as above
struct Container
{
Range opIndex() { return Range(); }
Range opSlice() { assert(0); }
}
void main()
{
Container c;
//foreach (e; c) {} // asserts in opSlice(), NG
foreach (e; c[]) {} // calls c.opIndex(), OK
}
The orignal post in d.learn forum:
http://forum.dlang.org/thread/vhsyxrroterdmqpgcesc@forum.dlang.org
--
More information about the Digitalmars-d-bugs
mailing list