Przeciążenie post-inkrementacji

0

Bruce Eckel napisał, że zwrócony obiekt zostanie utworzony w miejscu jego wywołania (a nie w ciele operator++), tzw Optymalizacja zwracania wartości.
G++ daje mi warning, kto ma racje ?

class A
{
        public:
        int a;
        A(int el): a(el) {}
        const A& operator++()
        {
                a++;
                return *this;
        }
        const A& operator++(int)
        {
                return A(a++);
        }
};

Na początku rozdziału tak to pokazał, ale to jest na pewno źle jak na moje oko.

        const A& operator++(int)
        {
                A tmp(a);
                a++;
                return tmp;
        }
0

Byłoby miło gdyby się tak dało, ale zwykle zwraca się obiekt tymczasowy przez wartość:

  KClass operator++(int)
   {
       KClass copy(*this);
       ++(*this);      // Calls KClass pre-increment operator
       return copy;
   }

http://en.allexperts.com/q/C-1040/Increment-operators.htm

Może w jakimś konkretnym środowisku (np. VC++) taka optymalizacja jaką opisałeś działa, ale nie liczyłbym że zawsze, w każdym kompilatorze.

0

aha, no on się powołuje w Thinking C++ na GCC więc sądziłem że powinno być w dobrze.
W twoim przykładzie, Bruce by powiedział ze powinno być słówko const, ponieważ obiekty tymczasowe są stałymi :>

0
Cpp napisał(a)

aha, no on się powołuje w Thinking C++ na GCC więc sądziłem że powinno być w dobrze.
W twoim przykładzie, Bruce by powiedział ze powinno być słówko const, ponieważ obiekty tymczasowe są stałymi :>

w którym rozdziale on pisze o tym co mówisz w tym temacie?

0

jestem na rozdziale o przeciążeniach operatorów, czyli rozdział 12. Wcześniej też był rozdział o stałych

0

optymalizacja zwracania wartości to może nastąpić właśnie w przypadku podanym przez Cplusa, a nie gdy zwracamy referencję czy wskaźnik na lokalny obiekt...
A ostatecznym rozwiązaniem będą "r-value reference" w C++11.

0

Tzw. "Optymalizacja zwracania wartości" (RVO / NRVO) jest opisana m.in. tutaj:
http://en.wikipedia.org/wiki/Return_value_optimization
http://msdn.microsoft.com/en-us/library/ms364057%28v=vs.80%29.aspx

Najbardziej pewna wersja rozwiązania tego problemu opisana jest tutaj:
http://bit.ly/n2xlaM

0

... tylko raczej i tak nie ma to (RVO) zastosowania w post-inkrementacji... (zawsze trzeba stworzyć obiekt tymczasowy).

1 użytkowników online, w tym zalogowanych: 0, gości: 1