Notice that you never have to implement TestFunc itself, you only implement TestFunc_Implementation.
This is because UHT automatically generates an implementation like this :
When generating that implementation, UHT takes the liberty to enforce optimization by turning all plain structure parameters into const&. Then you are forced to also use it to makes the signatures match.
In case of BlueprintCallable it is different since UHT doesn’t generate the function for you, you implement it yourself, so there’s no such problem.