Sto osservando l'ottimizzazione del valore di ritorno nel caso di tuple/legami e il comportamento che osservo non è quello che mi aspettavo. Nell'esempio seguente mi aspetterei che la semantica del movimento si avvii, cosa che fa, ma rimane una operazione di copia. L'uscita dal sotto in ottimizzato è:Ottimizzazione del valore di ritorno della tupla/cravatta
Test duo output, non_reference tuple
Default constructor invoked
Parameter constructor invoked
Copy constructor invoked
Move Assignment operator invoked
100
L'invocazione del costruttore di copia nel rendere tupla all'interno della funzione sembra inutile. C'è un modo per rimuovere questo? Sto usando il compilatore MSVC 2012.
#include <iostream>
#include <tuple>
class A
{
public:
int value;
A() : value(-1)
{
std::cout << "Default constructor invoked" << std::endl;
}
explicit A(const int v) : value(v)
{
std::cout << "Parameter constructor invoked" << std::endl;
}
A(const A& rhs)
{
value = rhs.value;
std::cout << "Copy constructor invoked" << std::endl;
}
A(const A&& rhs)
{
value = rhs.value;
std::cout << "Move constructor invoked" << std::endl;
}
A& operator=(const A& rhs)
{
value = rhs.value;
std::cout << "Assignment operator invoked" << std::endl;
return *this;
}
A& operator=(const A&& rhs)
{
value = rhs.value;
std::cout << "Move Assignment operator invoked" << std::endl;
return *this;
}
};
std::tuple<A, int> return_two_non_reference_tuple()
{
A tmp(100);
return std::make_tuple(tmp, 99);
}
int main(int argc, char* argv[])
{
std::cout << "Test duo output, non_reference tuple" << std::endl;
A t3;
int v1;
std::tie(t3, v1) = return_two_non_reference_tuple();
std::cout << t3.value << std::endl << std::endl;
system("pause");
return 0;
}
Grazie, è una buona alternativa per il caso semplice, ma se ci sono più azioni fatte su tmp e più uscite, non funzionerebbe. E non penso che funzionerebbe a MSVC 2012. – thorsan
Copia elision sta accadendo qui. Il problema è che 'tmp' non viene spostato nella' tupla'. Il costruttore di copie sta copiando 'tmp' nella tupla, non la tupla copiata. – Simple
@Simple lo so, forse la mia risposta non è abbastanza chiara. – TartanLlama