Стандарт только указывает, что #include <utility>
дает вам доступ к std::move
. Это не требует, чтобы это определение физически присутствовало в этом заголовочном файле. Стандартная библиотека может быть организована по своему усмотрению. Например, <utility>
может состоять только из #include <utility_internal>
(который затем содержит фактическую реализацию библиотеки) - ничто в стандарте не запрещает этого.
В реализации стандартной библиотеки Microsoft <utility>
имеет #include <type_traits>
. Таким образом, если вы сделаете #include <utility>
, вы получите std::move
. Это все, что вам нужно заботиться.