c++ - Constructing a pair with an rvalue -
in this:
vector<pair<string,int>> vp; string s; int i; while(cin>>s>>i) vp.push_back({s,i});
i'm curious last line. pair constructed in call push_back
, therefore moved, not copied, correct?
if had instead been written this:
vector<pair<string,int>> vp; string s= ...; int i= ...; pair<string,int> p{s,i}; vp.push_back(p);
while construction of pair involves same resources, pair named, p
, therefore no longer rvalue , therefore move semantics no longer used, , therefore pass value, causing copy made, right?
this implies me possible, constructing objects inside arg lists performance improvement; can verify?
the pair constructed in call
push_back
, therefore moved, not copied, correct?
the temporary pair constructed , bound rvalue reference argument of push_back
. moved argument vector
.
vp.push_back({s,i});
is equivalent to:
vp.push_back(std::pair<std::string, int>{s, i});
which equivalent to:
std::pair<std::string, int> p{s, i}; vp.push_back(std::move(p));
you don't need temporary use rvalue reference overload.
your second code example:
pair<string,int> p{s,i}; vp.push_back(p);
does copy instead of move, yes. note either way, we're still copying s
pair (either temporary or p
). better approach move s
temporary well:
vp.push_back({std::move(s), i});
or not have intermediate pair begin with:
vp.emplace_back(std::move(s), i);
this implies me possible, constructing objects inside arg lists performance improvement; can verify?
moving performance improvement, can std::move()
argument function - doesn't need temporary. constructing inside arg list affects when moved-from object's destructor gets called, nothing more.
Comments
Post a Comment