Что произойдет, если движимый объект, если я позвоню
std::set<>::insert
, и вставка не выполняется
потому что уже есть объект с тем же ключом, присутствующим в
набор. В частности, справедливо следующее:
struct Object
{
std::string key;
// ...
struct OrderByKey
{
bool operator()( Object const& lhs, Object const& rhs) const
{
return lhs.key < rhs.key;
}
};
Object( Object&& other )
: key(std::move(other.key))
// ...
{
}
};
и
std::set<Object, Object::OrderByKey> registry;
void
register(Object&& o)
{
auto status = registry.insert(std::move(o));
if (!status.second)
throw std::runtime_error("Duplicate entry for " + o.key);
}
После registry.insert
, когда вставка отсутствует, имеет
o
было перемещено или нет. (Если бы это могло быть перемещено, мне нужно
сохраните копию строки перед рукой, чтобы использовать ее в
сообщение об ошибке. (И да, я знаю, что я всегда могу написать:
throw std::runtime_error( "Duplicate entry for " + status->first.key );
Это то, что я, вероятно, сделаю. Но я все равно хотел бы знать что стандарт говорит об этом.)