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)
devuelveR
" ...]
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);