”check” function – OK to throw in destructor?
Ignoring the throwing out of the destructor (which is a bad idea).

My main problem is with usage:

check(a == 42) &lt;&lt; a &lt;&lt; " is not equal to 42!"; 


Here you present a trivial case. But not all error checking is trivial. I think a more realistic case (that will happen more often than you think);

Universe  a;
// .... STUFF
check(a.theMeaningLTUAE(42)) &lt;&lt; a &lt;&lt; " The truth not reached " &lt;&lt; a.checkInvariants();


Here we have calls to functions that will need to be evaluated even if they are never used (specifically checkInvariants() may be expensive (or even the streaming of a)). If the check passes you are still obliged to call it here but its value are simply discarded. I would prefer that the function is never called if no error message is going to be produced. 

What you really want is a short cut operator that prevents subsequent operations from happening. Note overloading &amp;&amp; and || on a class does not yield short-cut operators.

Or alternatively any functions should be passed as callbacks to operator&lt;&lt; and only evaluated if there output is required.