
Emil Dotchevski wrote:
Yes, but what happens if boost::wrap_string throws?
I know you can work your way around this issue but it's going to be really hacky.
The C++ standard library contains a function that tests whether a stack unwind is in progress. Only throw from the destructor if that function returns false. The function is broken in VC6 though. It always returns false. I see different problems here. One is the hackish and completely unintuitive way << works: it does not create a temporary (we can't have more than one throw_ temp) and actually modifies its left argument. But that's a style issue. Far more important: doing this might wreak havoc with the compiler's flow analysis. Consider: int what_on_earth(earth &e) { if(...) { return 1; } if(...) { return 2; } if(...) { return 3; } // Something bad happened, but it's a runtime possibility, so no assert() but an exception. throw something_bad_happened(); } Now change to throw_: int what_on_earth(earth &e) { // ... boost::throw_<something_bad_happened>() << e; // Does the compiler realize this is unreachable, or will it emit a missing return value warning/error? } Sebastian Redl