При использовании push_back
of std::vector
я могу нажать элемент самого вектора, не опасаясь аннулирования аргумента из-за перераспределения:
std::vector<std::string> v = { "a", "b" };
v.push_back(v[0]); // This is ok even if v.capacity() == 2 before this call.
Однако при использовании emplace_back
, std::vector
пересылает аргумент конструктору std::string
, так что построение копирования происходит на месте в векторе. Это заставляет меня подозревать, что перераспределение вектора происходит до того, как новая строка будет построена копией (иначе она не будет выделена на место), тем самым аннулируя аргумент перед использованием.
Означает ли это, что я не могу добавить элемент самого вектора с помощью emplace_back
, или у нас есть какая-то гарантия в случае перераспределения, аналогичная push_back
?
В коде:
std::vector<std::string> v = { "a", "b" };
v.emplace_back(v[0]); // Is this valid, even if v.capacity() == 2 before this call?