Dlaczego zły? Powiedziałbym nawet, że jest perfekcyjny. Ciężko o coś bardziej wydajnego, a to dzięki tzw. RVO (return value optimization) - specjalnej optymalizacji dokonywanej przez kompilator. Chodzi o to, że nie będzie tu wykonana żadna kopia. Jeśli funkcja zwraca rvalue, to funkcja wołająca getNowyObj() alokuje pamięć od razu na swoim stacku i obiekt zwracany z getNowyObj() jest tworzony od razu tam, zamiast najpierw wewnątrz getNowyObj. Tutaj może troche jaśnie..