Вот демонстрационная программа, которая показывает, как можно определить подстановку функции-члена.
#include <iostream>
#include <utility>
class A
{
private:
int x;
public:
explicit A( int x = 0 ) : x( x ) {}
void swap( A &a ) noexcept
{
int tmp = std::move( a.x );
a.x = std::move( this->x );
this->x = std::move( tmp );
}
void swap( A &&a ) noexcept
{
int tmp = std::move( a.x );
a.x = std::move( this->x );
this->x = std::move( tmp );
}
const int & getX() const { return x; }
};
int main()
{
A a1( 10 );
A a2( 20 );
std::cout << "a1.x = " << a1.getX() << '\n';
std::cout << "a2.x = " << a2.getX() << '\n';
a1.swap( a2 );
std::cout << "a1.x = " << a1.getX() << '\n';
std::cout << "a2.x = " << a2.getX() << '\n';
a1.swap( A( 30 ) );
std::cout << "a1.x = " << a1.getX() << '\n';
return 0;
}
Вывод программы:
a1.x = 10
a2.x = 20
a1.x = 20
a2.x = 10
a1.x = 30