Ответ 1
x(5); // works ?!
Это неявно передает x
в f_ptr
и вызывает это. Стандарт С++ 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()
(aka functors), что подразумевает, что компилятор этого не допускает.
Вы должны явно указать его:
static_cast<Functor>(y)(5);