diff --git a/CppCoreGuidelines.md b/CppCoreGuidelines.md index d75c3b3..365b9dd 100644 --- a/CppCoreGuidelines.md +++ b/CppCoreGuidelines.md @@ -12703,17 +12703,62 @@ consider `gsl::finally()` as a cleaner and more reliable alternative to `goto ex ##### Example - ??? + switch(x){ + case 1 : + while(/* some condition */){ + //... + break; + } //Oops! break switch or break while intended? + case 2 : + //... + break; + } ##### Alternative Often, a loop that requires a `break` is a good candidate for a function (algorithm), in which case the `break` becomes a `return`. - ??? + //BAD: break inside loop + void use1(){ + std::vector vec = {/* initialized with some values */}; + T value; + for(const T item : vec){ + if(/* some condition*/){ + value = item; + break; + } + } + /* then do something with value */ + } + + //GOOD: create a function and return inside loop + T search(const std::vector &vec){ + for(const T &item : vec){ + if(/* some condition*/) return item; + } + return T(); //default value + } + + void use2(){ + std::vector vec = {/* initialized with some values */}; + T value = search(vec); + /* then do something with value */ + } Often, a loop that uses `continue` can equivalently and as clearly be expressed by an `if`-statement. - ??? + for(int item : vec){ //BAD + if(item%2 == 0) continue; + if(item == 5) continue; + if(item > 10) continue; + /* do something with item */ + } + + for(int item : vec){ //GOOD + if(item%2 != 0 && item != 5 && item <= 10){ + /* do something with item */ + } + } ##### Note @@ -12722,7 +12767,7 @@ If you really need to break out a loop, a `break` is typically better than alter ##### Enforcement -??? +Flag any use of `break` and `continue` inside a loop. ### ES.78: Don't rely on implicit fallthrough in `switch` statements