То, что вы заметили, это неопределенное поведение.
Время жизни unique_ptr не соответствует ожидаемому.
Object<Test> object3 = std::make_unique<Test>(3);
cout << object3->num << endl; // print 0 ¿?¿?¿?
Вы создаете временный unique_ptr, после чего в конструкторе вы беретеадрес этого временного.
Object(std::unique_ptr<T>&& v) : value(static_cast<std::unique_ptr<T>*>(std::move(&v))) {}
В этом операторе вы берете адрес этого unique_ptr, после которого вы перемещаете этот указатель.Для необработанного указателя это не имеет никакого дополнительного эффекта.
Вы можете получить тот же неожиданный результат для всех ваших операторов, поскольку все они используют временные значения.
Обратите внимание, что вы также написали reinterpret_castиз unique_ptr в необработанный указатель.