https://d.puremagic.com/issues/show_bug.cgi?id=10926
--- Comment #6 from yebblies <[email protected]> 2013-11-13 15:12:14 EST --- (In reply to comment #5) > (In reply to comment #4) > > > Would this make any sense? > > > > (cast(const(int)[])c) ~= 20; > > > You are probably right, but it's quite surprising: > > > void main() { > const(int)[] a, b; > int[] c, d; > (true ? a : b) ~= 10; // OK > (true ? c : d) ~= 20; // OK > (true ? a : c) ~= 30; // Error: cast(const(int)[])c is not an lvalue > if (true) > a ~= 40; // OK > else > c ~= 40; // OK > } > > > So if both are fully mutable, or both have const items then you can append to > them, but if one of them is mutable and the other has const items, then it > can't append and you have to use a regular if statement. > > Thank you for your answer, I'll keep this issue closed. For a more involved answer: Appending modifies length, so it must be done on lvalues. `b ? a : c` can be transformed into an lvalue like this: `*(b ? &a : &c)` But if the types are different, it would have to end up as `*(b ? &a : cast(const(int)[]*)&c)` Which would allow `(b ? a : c) = a;` And that could cause 'c' to point to the data in 'a', which could be immutable. ======================================= This could be possible, if a new re-write was introduced: b ? a : c op ... -> b ? (a op ...) : (c op ...) But I'm not entirely sure we want that. -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
