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
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
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".
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.
#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()
No okej, ekstra, to wszyscy wiedzą, ale używasz std::move. Jak wykorzystać to w trywialnej konstrukcji implicit bez rzutowania?
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.