C++17: Fallthrough in switch statements
A C++ switch statement allows execution to fall through from one case to the next case when a break statement is missing. For example:
#include <iostream> using namespace std; enum class Mode { Default, Custom }; class Parameters {}; Parameters AskUserForCustomParameters() { cout << "Asking user for custom parameters..." << endl; return Parameters(); } void Process(const Parameters& parameters) { cout << "Processing parameters..." << endl; } void DoSomething(Mode mode) { Parameters parameters; // Create a default set of parameters switch (mode) { case Mode::Custom: AskUserForCustomParameters(); case Mode::Default: Process(parameters); break; } } int main() { DoSomething(Mode::Custom); cout << endl; DoSomething(Mode::Default); }
Of course, in this case we could just have used an if statement, but that wouldn’t demonstrate fallthrough in switch statements.
If you look at the code, the case for Mode::Custom does not contain a break statement. Some compilers will issue a warning for this kind of fallthrough because it might be unintended and a source of bugs. C++17 introduced a [[fallthrough]] attribute that you can use to specify in code that a fallthrough is intentional and should not generate a warning. Here is the modified fragment:
void DoSomething(Mode mode) { Parameters parameters; // Create a default set of parameters switch (mode) { case Mode::Custom: AskUserForCustomParameters(); [[fallthrough]]; case Mode::Default: Process(parameters); break; } }
You don’t need to use the [[fallthrough]] attribute for empty switch cases. No compiler will issue a warning for fallthrough with empty case statements. For example:
enum class Mode { Default, Custom, Standard }; void DoSomething(Mode mode) { Parameters parameters; // Create a default set of parameters switch (mode) { case Mode::Custom: AskUserForCustomParameters(); [[fallthrough]]; case Mode::Standard: case Mode::Default: Process(parameters); break; } }
My book, Professional C++, 4th Edition, explains all new C++17 features, and much more.