Это legacy наследние, которое сейчас считается устаревшим.
Когда трава была зеленее, а С++ еще слишком молод, в чистом С вообще не было boolean, поэтому использовался int, который использовался в качестве flag переменных.
При этом 0+1 = true, 1+1 = true, 2+1 = true (все верно)
Но при этом 1-0=false (верно), однако 2-1=true, 3-1=true.
Поэтому никогда никто не использовал декремент для подобных значений - иначе это могло привести к ошибке. Собственно инкремент тоже теоретически мог однажды переполниться...
Когда появился boolean, то для совместимости сохранили возможность инкремента boolean, но с самого начала это считалось deprecated.
The value obtained by applying a postfix ++ is the value that the operand had before applying the operator. [Note: the value obtained is a copy of the original value ] The operand shall be a modifiable lvalue. The type of the operand shall be an arithmetic type or a pointer to a complete object type. After the result is noted, the value of the object is modified by adding 1 to it, unless the object is of type bool, in which case it is set to true. [Note: this use is deprecated, see annex D. ]
Кстати это в 2015 году уже официально отменили:
www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p...
"The ++ operator for bool was deprecated in the original 1998 C++ standard, and it is past time to formally remove it.