a << 1,2;
a = a.segment(0,1);
cout << a;
using eval fixes the bug.
If this is the expected behaviour it would be useful to have an aliasing assert for this case.
Detecting all cases of aliasing is a very difficult task. Though we do detect a few cases involving transpose, the programmer is supposed to know what he is doing.
Just a side note:
I guess this particular example could also be implemented using
A general suggestion for this problem:
If a vector/matrix changes its size during assignment, one could:
* allocate a new (temp) vector
* assign the expression to the temp vector
* swap the vectors
* deallocate the temp vector (happens automatically)
I guess this would cause virtually no overhead in most cases, OTOH it might be a bad idea, if users rely on this behavior and then a vector accidentally does not change its size ...