This was an intentional design decision by Microsoft when they made the Direct Input drivers for xbox controllers. I've seen them say that it is because it makes it easier to do car games with accelerator/brake on the two triggers. Any direct input based input lbirary (like sfml) will have this issue.
The way to bypass it is to use XInput instead. It exposes all features of the xbox controller as well as keeping the triggers separate. Luckily it's also very easy to use.
There's no setup or initialisation. include the xinput.h header, link with the xinput library, then every update in the game do:
XINPUT_STATE state;
DWORD result = XInputGetState(0, &state);
(The 0 is the index (0-3) of the controller you want)
The triggers can then be read using state.GamePad.bLeftTrigger and state.GamePad.bRightTrigger (values 0-255).
Using vibration is just as easy. (make state variable, set 2 motor values, call set state)