Alternatively, I can avoid the tmp variable altogether and get a working program to copy the result of matrix-vector multiplication onto a new vector y but then I would need two multiplications. E.g.
std::copy(prod(m,x).begin(), prod(m,x).end(), y.begin());
This doesn't answer your question, but I just wanted to point out that the above line is undefined behaviour, since the begin and end iterators refer to two different ranges (two different temporary variables). This problem can be avoided by using boost::copy (from Boost.Range) instead, which allows you to mention the range just once:
boost::copy(prod(m, x), y.begin());
Unfortunately I'm unable to get the below suggestion to work. Could you please mention if this was what you were referring to: http://www.boost.org/doc/libs/1_49_0/libs/range/doc/html/range/reference/ada...
If so, the closest file I have in my Boost Version 1.0 is boost/range/iterator_range.hpp but that doesn't have the below copy function. I'll probably need to get the 1.49.0 version then.
Boost.Range's copy function is documented here: http://www.boost.org/doc/libs/1_49_0/libs/range/doc/html/range/reference/alg... I believe it was first added in version 1.43. However, it's not difficult to write your own version. The following will work for any range type that has begin() and end() member functions: template void copy(const Range& input, OutputIterator output) { std::copy(input.begin(), input.end(), output); } Regards, Nate