Comprender `std :: is_move_constructible`

Tipos sin un constructor de movimiento, pero con un constructor de copia que aceptaconst T& argumentos, satisfacerstd::is_move_constructible. Por ejemplo, en el siguiente código:

#include <type_traits>

struct T {
    T(const T&) {}
    //T(T&&) = delete;
};

int main() {
    static_assert(std::is_move_constructible<T>::value, "not move constructible");
    return 0;
}

T no tendrá un constructor de movimiento implícito ya que tiene un constructor de copia definido por el usuario.

Sin embargo, si descomentamos la eliminación explícita del constructor de movimiento, el código ya no se compila. ¿Por qué es esto? Hubiera esperado que el constructor de copias explícitas todavía satisficierastd::is_move_constructible.

¿La sobrecarga juega un papel, eligiendo el constructor de movimiento declarado y luego falla porque se elimina?

Si esta diferencia entre la constructibilidad del movimiento entre unno implicit move ctor y undeleted move ctor la clase está ordenada por el estándar, por favor cite, y si es posible, proporcione una justificación (como "proporcionar una instalación para prohibir la construcción de movimientos", lo primero que se me viene a la mente).

Respuestas a la pregunta(3)

Su respuesta a la pregunta