move semnantics

pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

http://ideone.com/Uv6CXg

Czegoś tutaj nie rozumiem. Dlaczego

Kopiuj
56.      storage<tmp> T2 (T + T);

tutaj wywołuje się konstruktor obiektu T+T, natomiast nie wywołuje sie konstruktor T2.
Sądziłem, ze powinno być:
konstruktor T+T
konstruktor przenoszący T2


do not code, write prose
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0

copy elision: http://en.cppreference.com/w/cpp/language/copy_elision

When a nameless temporary, not bound to any references, would be moved or copied into an object of the same type (ignoring top-level cv-qualification), the copy/move is omitted. When that temporary is constructed, it is constructed directly in the storage where it would otherwise be moved or copied to. When the nameless temporary is the argument of a return statement, this variant of copy elision is known as RVO, "return value optimization".

pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

To załatwia sprawę większości sytuacji, w których przydatny może być move constructor? Bo teraz nie wiem czy jesteśmy w stanie zaimplementować coś, co nie jest złożone i wykorzystuje move constructor. Bo niby wszystko można podpiąć pod copy elision.


do not code, write prose
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 13 godzin
0
Kopiuj
#include <iostream>
#include <utility>
using namespace std;

struct T
{
	T()
	{
		cout << "T()" << endl;
	}
	~T()
	{
		cout << "~T()" << endl;
	}
	T(const T&)
	{
		cout << "T(const T&)" << endl;
	}
	T& operator=(const T&)
	{
		cout << "T& operator=(const T&)" << endl;
		return *this;
	}
	T(T&&)
	{
		cout << "T(T&&)" << endl;
	}
	T& operator=(T&&)
	{
		cout << "T& operator=(T&&)" << endl;
		return *this;
	}
};

int main()
{
	T t1;
	T t2 = t1;
	t1 = t2;
	T t3 = move(t1);
	t2 = move(t3);
}
Kopiuj
c:\pp\MYPROGS\CPP>g++ muf.cpp --std=gnu++11 -o muf.exe -O3 -s

c:\pp\MYPROGS\CPP>muf
T()
T(const T&)
T& operator=(const T&)
T(T&&)
T& operator=(T&&)
~T()
~T()
~T()
edytowany 3x, ostatnio: Azarien
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

No okej, ekstra, to wszyscy wiedzą, ale używasz std::move. Jak wykorzystać to w trywialnej konstrukcji implicit bez rzutowania?


do not code, write prose
Azarien
ale do czego ci to?
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0

Konstruktor ma inicjować obiekt i tyle. Jak nic nie musi robić to tym lepiej. Poleganie na efektach ubocznych konstruktora śmierdzi.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.