Я понимаю, почему иногда рекомендуется реализовать собственную функцию swap()
для данного класса.
Например, если у нас есть класс, использующий идиому pimpl, мы, вероятно, захотим определить собственный конструктор копирования, чтобы он выполнял глубокое копирование содержимого объекта, переданного в качестве аргумента, вместо поверхностного копирования, которое было бы выполнено конструктором копирования по умолчанию. То же самое можно применить к оператору присваивания копии.
Поскольку кажется, что std::swap()
реализован с точки зрения (по крайней мере, когда речь идет о C++03) как конструктора копирования, так и оператора присваивания копирования. Было бы неэффективно выполнять глубокие копии объектов, подлежащих замене, поскольку необходимо выполнить только замену указателей, содержащихся в этих объектах.
Мой вопрос заключается в том, почему мы должны реализовать нашу функцию swap()
как не генерирующую.
В случае, описанном выше, я предполагаю, что речь идет только о семантике: поскольку новые ресурсы не выделяются (т. Е. Два существующих указателя просто меняются местами). Для такой функции не имеет особого смысла генерировать исключение.
Однако могут быть и другие причины или сценарии, которые я упускаю из виду в своих рассуждениях.
throw()
? 2. Прежде чем задать вопрос почему swap не должен вызывать выбросы, как насчет того, чтобы сначала спросить: должен swap не вызывать выбросы? - person eerorika   schedule 18.05.2017throw()
как часть сигнатуры функции. - person 眠りネロク   schedule 18.05.2017