move semnantics

0

http://ideone.com/Uv6CXg

Czegoś tutaj nie rozumiem. Dlaczego

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

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".

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.

0
#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);
}
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()
0

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

0

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

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