Rewrote operator overloads using auto and decltype