functores c++ function-pointers functor function-call

c++ - functores - functor prolog



¿Por qué es ''X x; X();'' permitido, cuando ''X'' define una conversión a puntero de función, pero no, cuando define una conversión a un functor? (1)

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 ?! }

Ejemplo vivo en Ideone . Salida:

error: no hay coincidencia para la llamada a ''(Y) (int)''

P1: ¿Por qué se permite la llamada a x(5) , aunque X solo define una conversión al puntero de función y no al operator() ?

P2: A la inversa, ¿por qué no se permite lo mismo, si definimos una conversión a otro functor?


x(5); // works ?!

Esto implícitamente f_ptr x en un f_ptr y lo llama. Estándar C ++ 11:

§ 13.3.1.1.2 Llamada a objeto de tipo de clase [over.call.object]

2) Además, para cada función de conversión no explícita declarada en T de la forma

operator conversion-type-id ( ) attribute-specifier-seqopt cv-qualifier ;

[... donde conversion-type-id denota el tipo "puntero a función de (P1,...,Pn) devuelve R " ...]

y(5); // doesn''t ?!

El estándar no menciona nada sobre la conversión implícita a tipos de clase que sobrecargan el operator() (también conocidos como functores), lo que implica que el compilador no permite eso.

Debes lanzarlo explícitamente:

static_cast<Functor>(y)(5);