¿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.
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?