В прекрасном ответе copy-and-swap-idiom есть часть кода, мне нужно немного помочь:
class dumb_array
{
public:
// ...
friend void swap(dumb_array& first, dumb_array& second) // nothrow
{
using std::swap;
swap(first.mSize, second.mSize);
swap(first.mArray, second.mArray);
}
// ...
};
и он добавляет примечание
Существуют и другие претензии, которые мы должны специализировать std:: swap для нашего типа, предоставлять своп в классе с возможностью обмена свободной функцией и т.д. Но это все лишнее: любое правильное использование swap будет проходить через безоговорочный вызов, и наша функция будет найдена через ADL. Одна функция будет делать.
С friend
Я немного "недружелюбен", признаюсь. Итак, мои основные вопросы:
- выглядит как свободная функция, но внутри тела класса?
- Почему это не
swap
static? Очевидно, что он не использует никаких переменных-членов. - "Любое правильное использование swap обнаружит swap через ADL" ? ADL будет искать пространства имен, не так ли? Но разве он также выглядит внутри классов? Или здесь, где
friend
входит?
Побочных вопросы:
- С С++ 11, следует ли отмечать мой
swap
noexcept
? - С С++ 11 и его range-for, должен ли я помещать
friend iter begin()
иfriend iter end()
таким же образом внутри класса? Я думаю, чтоfriend
здесь не нужен, правильно?