There is only one instance where you might want to use the signed keyword. signed char is always a different type from “plain” char, which may be a signed or an unsigned type depending on the implementation.
C++14 3.9.1/1 says:
It is implementation-defined whether a
charobject can hold negative values. Characters can be explicitly declaredunsignedorsigned. Plainchar,signed char, andunsigned charare three distinct types […]
In other contexts signed is redundant.
Prior to C++14, (and in C), there was a second instance: bit-fields. It was implementation-defined whether, for example, int x:2; (in the declaration of a class) is the same as unsigned int x:2; or the same as signed int x:2.
C++11 9.6/3 said:
It is implementation-defined whether a plain (neither explicitly signed nor unsigned)
char,short,int,long, orlong longbit-field is signed or unsigned.
However, since C++14 this has been changed so that int x:2; always means signed int. Link to discussion