¿Por qué puedo evitar conversiones implícitas para primitivas pero no para tipos definidos por el usuario?

Los Estándares C ++ de alta integridad sugieren que los argumentos de valor de las funciones se pueden eliminar, evitando así conversiones implícitas.

http://www.codingstandard.com/rule/8-3-4-define-delete-functions-with-parameters-of-type-rvalue-reference-to-const/

Descubrí que el comportamiento de las primitivas y los tipos definidos por el usuario es muy diferente.

struct A { };

struct B { B(const A& ) {} };

template <class T>
void foo(const T&&) = delete;  // 1 - deleted rvalue overload. const intentional.

void foo(B) {}                 // 2

void foo(int) {}               // 3

int main(int argc, char* argv[])
{
  A a;
  foo(a);   // This resolves to 2
  foo(3.3); // This resolves to 1
  foo(2);   // This resolves to 3 (as expected).
}       

¿Por qué una sobrecarga de rvalue eliminada impide una conversión implícita a int pero no de un tipo definido por el usuario a otro?

Respuestas a la pregunta(3)

Su respuesta a la pregunta