쉽게 말하면 위에 df는 "a" 문자열을 string 클래스에 있는 오버로딩된 연산자 =( https://www.cplusplus.com/reference/string/string/operator= )로 할당하기 때문에 string 클래스의 인스턴스가 생성, 할당이 되는 거고 그렇기 때문에 df + b에서 string 클래스에 있는 오버로딩된 연산자 +( https://www.cplusplus.com/reference/string/string/operator+ )로 문자열과 문자를 합칠 수 있는 겁니다.
그런데 "a" 자체는 클래스가 아닌(클래스는 자료와 관련된 함수를 모아놓은 것이라고 보면 됩니다) string literal이며 표준에 정의된 대로 const char* 형으로 취급해서 계산하면 포인터가 가리키는 주소("a"가 저장된 주소)를 'b'의 아스키 코드값 만큼 더하는 연산을 하게 됩니다. 그럼 예상치 못한 이상한 메모리 주소를 가리키게 되고 위 경우에는 "o relocation protocol version %d."를 가리키고 있는 상황인 거죠.