std::is_copy_constructible<T> is defined as exactly std::is_constructible<T, const T&> , i.e. it only checks that building from const lvalue is possible, it does not check all the properties of the CopyConstructible concept.
So your test does not show what you think it shows. Your type is not a CopyConstructible type because it does not meet some other requirements.
Regarding the original question, yes. Because all CopyConstructible types must meet the requirements for MoveConstructible, all of them are MoveConstructible types. MoveConstructible does not require anything to be moved, only this construction from rvalues is possible, and all types of CopyConstructible can be built from rvalues (even if they can make a deep copy, not move).
You can create corrupt types that can be copied from lvalues, but not from rvalues, or can be copied from const lvalues, but not unconsolidated lvalues and other abominations. Such types are not CopyConstructible and do not work with the standard C ++ library. There are very few good reasons to ever create such vicious types.
source share