x(5); // works ?!
Это неявно приводит x
к f_ptr
и вызывает это.Стандарт C ++ 11:
§ 13.3.1.1.2 Вызов объекта класса [over.call.object]
2) Кроме того, для каждого не явногофункция преобразования, объявленная в T в виде
operator conversion-type-id ( ) attribute-specifier-seqopt cv-qualifier ;
[… где conversion-type-id
обозначает тип «указатель на функцию (P1,...,Pn)
, возвращающий R
»…]
y(5); // doesn't ?!
В стандарте ничего не говорится о неявном преобразовании в типы классов, которые перегружают operator()
(он же функторы), что подразумевает, что компилятор этого не допускает.
Вы должны привести егоявно:
static_cast<Functor>(y)(5);