I read Zevv's thread and Araq's position made no sense to me. Typically you'll have an application collect data from user input in some way, transform it in some manner potentially and then want to send that on to other threads. There's no "I get to instantiate this with fixed data at compile time" or such. The only way that works is if you copy all the data you collected into the message. And at that point you can just forget threading's "non-copy" promise because you've just forced the copying onto the user