Right.
If you don't define any of the Big Five (copy constructor, move constructor, copy assignment operator, move assignment operator, destructor), newer compilers can even generate them implicitly. Also, by using
= default or
= delete, you can specify exactly which functions you want to have, without writing the implementation. A default-generated move constructor moves the member variables element-wise, which is not always what you want.
The user still has to take care to allow move semantics. For example, here the compiler must perform a copy
sf::Texture texture;
texture.loadFromFile(...);
std::vector<sf::Texture> textures;
textures.push_back(texture);
// better:
textures.push_back(std::move(texture));
In other cases, move semantics happen automatically:
sf::Texture createTexture()
{
sf::Texture texture;
texture.loadFromFile(...);
return texture;
}