readability-simplify-boolean-expr¶
Looks for boolean expressions involving boolean constants and simplifies them to use the appropriate boolean expression directly.
Examples:
Initial expression | Result |
if (b == true) | if (b) |
if (b == false) | if (!b) |
if (b && true) | if (b) |
if (b && false) | if (false) |
if (b || true) | if (true) |
if (b || false) | if (b) |
e ? true : false | e |
e ? false : true | !e |
if (true) t(); else f(); | t(); |
if (false) t(); else f(); | f(); |
if (e) return true; else return false; | return e; |
if (e) return false; else return true; | return !e; |
if (e) b = true; else b = false; | b = e; |
if (e) b = false; else b = true; | b = !e; |
if (e) return true; return false; | return e; |
if (e) return false; return true; | return !e; |
- The resulting expression e is modified as follows:
- Unnecessary parentheses around the expression are removed.
- Negated applications of ! are eliminated.
- Negated applications of comparison operators are changed to use the opposite condition.
- Implicit conversions of pointers, including pointers to members, to bool are replaced with explicit comparisons to nullptr in C++11 or NULL in C++98/03.
- Implicit casts to bool are replaced with explicit casts to bool.
- Object expressions with explicit operator bool conversion operators are replaced with explicit casts to bool.
- Implicit conversions of integral types to bool are replaced with explicit comparisons to 0.
- Examples:
The ternary assignment bool b = (i < 0) ? true : false; has redundant parentheses and becomes bool b = i < 0;.
The conditional return if (!b) return false; return true; has an implied double negation and becomes return b;.
The conditional return if (i < 0) return false; return true; becomes return i >= 0;.
The conditional return if (i != 0) return false; return true; becomes return i == 0;.
The conditional return if (p) return true; return false; has an implicit conversion of a pointer to bool and becomes return p != nullptr;.
The ternary assignment bool b = (i & 1) ? true : false; has an implicit conversion of i & 1 to bool and becomes bool b = (i & 1) != 0;.
The conditional return if (i & 1) return true; else return false; has an implicit conversion of an integer quantity i & 1 to bool and becomes return (i & 1) != 0;
Given struct X { explicit operator bool(); };, and an instance x of struct X, the conditional return if (x) return true; return false; becomes return static_cast<bool>(x);