
On Sun, Nov 1, 2009 at 6:03 PM, Domagoj Saric <dsaritz@gmail.com> wrote:
"Gottlob Frege" <gottlobfrege@gmail.com> wrote in message news:97ffb310910302049u46d5cbddm557fb47bfbd663da@mail.gmail.com...
On Wed, Oct 28, 2009 at 6:46 PM, Domagoj Saric <dsaritz@gmail.com> wrote:
i mentioned the latter 'issue' already in the first post... generally both points seem to me like non-issues because they cannot become issues unintentionally... both can come into play _only_ if the user converts the temporary return object into a local scoped object/variable...which, as far as i know, you cannot do 'by accident'/unintentionally...you have to be verbose about it...(although, ironically the new auto makes it easier for you to do "the wrong thing"...but still not easy enough that you can do it by a 'non conscious mistake')...
bool diff(file srcA, file srcB, file output) { // get our files ready... error_code srcA_err = file_open(srcA); error_code srcB_err = file_open(srcB); error_code out_err = file_open(output);
if (srcA_err || srcB_err || out_err) // check for errors return false;
// do the diff...
return true; }
true...a good "find" ;) sure we could argue that this is "non-idiomatic" usage...but still, as you said, it is not "completely unreasonable" so it should also work correctly...
there are two ways we could achieve this: ...one is to "smarten" the do_throw() function (i wrote about in other posts) to first do the "if( !std::uncaught_exception() )" check before doing the actual throw (this is, imho, safe and "non-evil" which i shall argue in a response to emil)...
bool copy(file dest, file src) { error_code errSrc = open(src); error_code errDst = create(dest); if (errSrc || errDst) return false; //copy... return true; } In this case, we are not throwing during exception unwinding, but if errSrc is true, errDst is NOT checked, and thus throws. Should it? I think, at best, a smart_err_code should just assert() in debug only. ie check to make sure errors are being checked -> ie check for programmer error. As for throwing or not, lean towards throwing, supply both when there is good reason. I think throwing needs to become more common, particularly with multi-threading, because you can't necessarily check pre-conditions anymore - the preconditions might not last long enough for the function call. Even for file functions: if (!exists(file)) // check precondition create(file); // yet this throws "already exists" Tony