Зависит от кода функции и опций компилятора.
Советую всем программистам на C++ хотябы почитать про ассемблер.
Стек, регистры, вот это вот все. Тогда станет понятно, как работает процессор.
Тогда станет понятно что "сам объект tmp" никак не вернуть. Это локальная переменная, лежащая на стеке в части, которая будет отброшена при выходе из функции. Отсюда вытекает, что вообще говоря, там должна быть копия.
Но есть такая оптимизация, как RVO. В стандарте даже прописано, когда конкретно она гарантирована. Тогда копии не происходит. При этом компилятор вообще не создает локальной переменной. А вместо этого сразу же работает с тем местом, куда надо будет возвращать значение.
Если код и включенные оптимизации позволяют это сделать - то копии не будет. Но в общем случае - будет копия.