void f(int){}
typedef void (*f_ptr)(int);
struct Functor{
void operator()(int){}
};
struct X{
operator f_ptr(){ return f; }
};
struct Y{
operator Functor(){ return Functor(); }
};
int main(){
X x; Y y;
x(5); // works ?!
y(5); // doesn't ?!
}
Live example on Ideone. Output:
error: no match for call to '(Y) (int)'
Q1: Why is the call to x(5)
allowed, even though X
only defines a conversion to function pointer, and not operator()
?
Q2: Conversely, why is the same thing not allowed, if we define a conversion to another functor?
This implicitly casts
x
to anf_ptr
and calls that. C++11 standard:The standard doesn't mention anything about implicit conversion to class types that overload
operator()
(aka functors), which implies that the compiler doesn't allow that.You must cast it explicitly: