If the parameter type is non-trivial for the purposes of calls, the caller must allocate space for a temporary and pass that temporary by reference
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#value-parameter
And *non-trivial for the purpose of calls is defined as:
- it has a non-trivial copy constructor, move constructor, or destructor
- all of its copy and move constructors are deleted.
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#non-trivial
Is there any explicit reason for this?