Просто хотел добавить, почему эта идиома вообще используется, что похоже на дух исходного вопроса.
Эта идиома используется во многих классах библиотеки std, где реализована подкачка. Из http://www.cplusplus.com/reference/algorithm/swap/:
Многие компоненты стандартной библиотеки (внутри std) вызывают обмен неквалифицированным образом, чтобы разрешить пользовательские перегрузки для нефундаментальных типов, которые будут вызываться вместо этой универсальной версии: Пользовательские перегрузки подкачки, объявленные в том же пространстве имен, что и тип, для которого они предназначены при условии, что они будут выбраны с помощью поиска, зависящего от аргументов, в этой универсальной версии.
Таким образом, цель использования неквалифицированного «свопа» для замены переменных-членов в описанной вами функции состоит в том, чтобы ADL мог найти настраиваемые функции подкачки для этих классов (если они существуют где-то еще).
Поскольку эти настроенные классы не существуют в классе, на который вы ссылаетесь (mSize и mArray - это std :: size_t и int *, соответственно, в исходном примере), а std :: swap работает нормально, автор добавил комментарий, что в данном случае в этом нет необходимости, но это хорошая практика. Он получил бы те же результаты, если бы явно вызвал std :: swap, как указано в предыдущем ответе.
Почему это хорошая практика? Потому что, если у вас есть в качестве членов экземпляры классов, для которых определен настраиваемый своп, вы хотите, чтобы поведение было таким: проверьте настраиваемую функцию подкачки ... если она существует, используйте ее, если она не существует, используйте библиотеку std функции. В случаях, когда нет доступных настраиваемых функций подкачки, вы хотите, чтобы он был по умолчанию для простой реализации std :: swap, описанной в приведенной выше ссылке. Отсюда и «использование» для подкачки встроенных типов в пространство имен. Но их будут судить в последнюю очередь.
См. Также: https://stackoverflow.com/a/2684544/2012659
Если по какой-то причине вы ненавидите «использование std :: swap», я полагаю, что теоретически вы могли бы разрешить это вручную, явно вызвав std :: swap для всего, что вы хотите поменять местами, используя std :: swap и используя неквалифицированный swap для каждый известный вам настраиваемый своп определен (все еще обнаруживается с помощью ADL). Но это подвержено ошибкам ... если вы не создавали эти классы, вы можете не знать, существует ли для них настраиваемый своп. А переключение между std :: swap и swap сбивает код с толку. Лучше позволить компилятору все это обрабатывать.
person
eculeus
schedule
17.04.2015