Я пытаюсь понять условия на std::swap из [С++ 11: utility.swap]. Шаблон определяется как
template <typename T> void swap(T &, T &)
(плюс некоторые детали noexcept) и как эффект "обмена значениями, хранящимися в двух местах".
Является ли следующая программа корректной?
#include <utility>
int main()
{
int m, n;
std::swap(m, n);
}
Если я сам написал код подкачки (т.е. int tmp = m; m = n; n = tmp;), он будет иметь поведение undefined, так как он будет пытаться преобразовать lvalue-to-rvalue в неинициализированный объект. Но стандартная функция std::swap, похоже, не имеет никаких условий, наложенных на нее, и не может быть выведено из спецификации, что существует любое значение lvalue-to-r и, следовательно, UB.
Требуется ли стандарту std::swap выполнить некоторую магию, которая четко определена на неинициализированных объектах?
Чтобы прояснить эту точку, рассмотрим функцию void f(int & n) { n = 25; }, которая никогда не имеет поведения undefined (поскольку она не читается из n).