digitalmars.D.bugs - [Issue 14625] New: opIndex() doesn't work on foreach container
- via Digitalmars-d-bugs (53/54) May 27 2015 https://issues.dlang.org/show_bug.cgi?id=14625
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 puremagic.com Reporter: k.hara.pg 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#SliceTo 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 --
May 27 2015