Wdrażam klasę fabryki, która buduje wektor z uint8_t. Chcę móc wykorzystać semantykę ruchu podczas zwracania wynikowego wektora. To wydaje się działać, ale nie jestem pewien, czy to jest właściwy sposób na osiągnięcie tego, co chcę.Jak używać semantyki ruchu podczas zwracania zmiennej składowej?
Widziałem kilka przykładów tego, jak zwracana zmienna automatyczna będzie uważana za wartość rwartą i użyje konstruktora ruchu kodu wywołującego, ale w moim przykładzie zwróconym obiektem jest element członkowski. Wiem, że członek straci swoją zawartość, jeśli wywołujący umieści wartość zwracaną w konstruktorze ruchu - i właśnie tego chcę.
Pisałem to mniej więcej tak:
#include <cstdint>
#include <iostream>
#include <vector>
class Factory
{
public:
std::vector<uint8_t> _data;
Factory(std::size_t size) :
_data(size, 0)
{
}
void buildContent(int param)
{
// perform operations on the contents of _data
}
std::vector<uint8_t> && data()
{
return std::move(_data);
}
};
int main()
{
Factory factory(42);
factory.buildContent(1);
std::vector<uint8_t> temp(factory.data());
std::cout << "temp has " << temp.size() << " elements" << std::endl;
std::cout << "factory._data has " << factory._data.size() << " elements" << std::endl;
return 0;
}
Edit:
Aha, i przykładowy kod generuje następujące:
temp has 42 elements
factory._data has 0 elements
Więc jakie jest twoje pytanie? – DanielKO
"Nie jestem pewien, czy to jest właściwy sposób na osiągnięcie tego, czego chcę." – Geoffroy
Och, teraz widzę. Sprawdź to: http://stackoverflow.com/questions/9914548/using-of-rvalue-references-in-c11 – DanielKO