>rewriting the function signature to return void and take an extra pointer parameter, which is written to before returning
This is completely unrelated to RVO. Every non-trivial class is returned via pointers to caller-allocated storage under the Itanium ABI. Period.