operator=(const OakTree& other) {
// First create local copies without modifying the OakTree objects.
// Copying may throw, but this OakTree will still be in a valid state
auto leafs = other.leafs_;
auto branches = other.branches_;
// No exceptions thrown, we can now safely modify
// the state of this object by non-throwing swap
std::swap(leads_, leafs);
std::swap(branches_, branches);
return *this;
}
std::vector<Leaf> leafs_;
std::vector<Branch> branches_;
} 1) Разве тут нужен вообще operator= ? Ведь по идее тут работает правило нуля. 2) разве тут не должен быть не std::swap , а friend swap, вызываемый посредством ADL или как его там правильно назвать
1) Тут же указана причина. Если выбросится исключение, состояние должно остаться неизменным.
2) std::swap для std::vector специализирован и позовёт нужный свап сам
Если все доверить компилятору (правило 0), то тупая железяка будет сразу копировать в this->leafs_ = other.leafs_. Не озадачиваясь тем, что leafs и branches логически связаны. И если если leafs скопированы, а при копировании brances срыв - то получится тыква.
Вообще, честно говоря, шибко мудреный код. Мне лично ни разу такого писать не приходилось. Все как то по простому - правило_0. НО! Если нужно запустить Луну-25 именно НА Луну, а не В Луну, то писать нужно именно так.
Обсуждают сегодня