Usually when an object of a certain type is converted to an object of another type (a non-reference type), a temporary object is created (not a const object). A temporary object (invisible, nameless, rvalue) can only bind (in C++98/03) to references that are const (except for the temporary known as the 'exception object'). Therefore, the result of a conversion that creates a temporary can only be used as an argument to a function that either accepts it as a const reference, or as a type that it can be copied/converted into.
So for e.g.
void f(double); // 1
void f(const int&); // 2
void f(int&); // 3
struct B { B(int) { } };
struct C { C(int) { } };
void f(B b); // 4
void f(B& b); // 5
void f(const C& c); //6
void f(C& c); // 7
// D inherits from B
struct D : B { D(int) : B(0) { } };
void f(D& d); // 8
int main()
{
f( (int) 3.0 ); // calls 2, NOT 3
f( (float) 3 ); // calls 1 - const reference requires the same type
f( 1 ); // calls 2, NOT 3
f( (B) 1 ); // calls 4, not 5 - can accept it by non-const value
f( (C) 1 ); // calls 6, not 7 - can accept it by const-reference
f( (D) 1 ); // calls 4, not 8 - since a 'D' temporary object can be converted to a 'B' object - but will not bind to a non-const reference
}
Hope that helps.