#include <set> #include <string> #include <cassert> using namespace std::literals; int main() { auto coll = std::set{ "hello"s }; auto s = "hello"s; coll.insert(std::move(s)); assert("hello"s == s); // Always OK? }
Does the C++ standard guarantee that a failed insertion into an associative container will not modify the rvalue-reference argument?
Explicit and unequivocal NO. Standard doesn't have this guarantee, and this is why try_emplace exists.
See notes:
Unlike insert or emplace, these functions do not move from rvalue arguments if the insertion does not happen, which makes it easy to manipulate maps whose values are move-only types, such as
std::map<std::string, std::unique_ptr<foo>>
. In addition,try_emplace
treats the key and the arguments to the mapped_type separately, unlikeemplace
, which requires the arguments to construct avalue_type
(that is, astd::pair
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With