diff --git a/CppCoreGuidelines.md b/CppCoreGuidelines.md index c7e29cf..7c6cb21 100644 --- a/CppCoreGuidelines.md +++ b/CppCoreGuidelines.md @@ -1,6 +1,6 @@ # C++ Core Guidelines -July 3, 2020 +August 3, 2020 Editors: @@ -16187,25 +16187,27 @@ This can be messy: { Gadget g1 = make_gadget(17); if (!g1.valid()) { - return {0, g1_error}; + return {0, g1_error}; } - Gadget g2 = make_gadget(17); + Gadget g2 = make_gadget(31); if (!g2.valid()) { - cleanup(g1); - return {0, g2_error}; + cleanup(g1); + return {0, g2_error}; } // ... if (all_foobar(g1, g2)) { - cleanup(g1); cleanup(g2); + cleanup(g1); return {0, foobar_error}; + } + // ... - cleanup(g1); cleanup(g2); + cleanup(g1); return {res, 0}; } @@ -16215,31 +16217,35 @@ A not uncommon technique is to gather cleanup at the end of the function to avoi std::pair user() { error_indicator err = 0; + int res = 0; Gadget g1 = make_gadget(17); if (!g1.valid()) { - err = g1_error; - goto exit; + err = g1_error; + goto g1_exit; } { - Gadget g2 = make_gadget(17); - if (!g2.valid()) { + Gadget g2 = make_gadget(31); + if (!g2.valid()) { err = g2_error; - goto exit; + goto g2_exit; + } + + if (all_foobar(g1, g2)) { + err = foobar_error; + goto g2_exit; + } + + // ... + + g2_exit: + if (g2.valid()) cleanup(g2); } - if (all_foobar(g1, g2)) { - err = foobar_error; - goto exit; - } - // ... - } - - exit: - if (g1.valid()) cleanup(g1); - if (g2.valid()) cleanup(g2); - return {res, err}; + g1_exit: + if (g1.valid()) cleanup(g1); + return {res, err}; } The larger the function, the more tempting this technique becomes.