Ich bin nicht sicher, ob ich das richtig verstehe diesen Code:Karte bewegen emplace mit lvalue
template<typename M>
void add(M& m,int i, std::string s)
{
m.emplace(i,std::move(s));
}
int main()
{
std::map<int,std::string> m;
add(m,1,"foo");
}
Wenn add
genannt wird, die std::string
und die int
kopiert werden. Die Methode emplace
konstruieren Sie eine std::pair
, die in die std::map
(keine Kopie benötigt) bewegt wird. Aber die Kopie von int
ist ein Lvalue, während die Kopie von std::string
in einen rvalue umgewandelt wird, also welcher Konstruktor aufgerufen wird, um das std::pair
zu konstruieren? Da ein Argument nicht verschoben werden kann, nehme ich an, dass hier eine zusätzliche Kopie stattfindet. Ist es richtig? Offensichtlich würde ich, wenn ich auch die Kopie von int
zu einem rvalue überspiele, keine zusätzlichen Kopien erwarten.
Also wird das 'std :: pair' konstruiert, indem' int' kopiert und die 'std :: string' nach rechts verschoben wird? –
@MarcoAgnese korrekt – imreal