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

Ideone 上的实时示例。输出:

错误:对“(Y)(int)”的调用不匹配

Q1:为什么x(5)允许调用,即使X只定义了到函数指针的转换,而不是operator()

Q2:相反,如果我们定义到另一个函子的转换,为什么不允许同样的事情?

4

1 回答 1

25
x(5); // works ?!

这隐含地转换x为 anf_ptr并调用它。C++11 标准:

§ 13.3.1.1.2 调用类类型的对象 [over.call.object]

2) 另外,对于每一个在 T 中声明的非显式转换函数的形式

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

[…whereconversion-type-id表示类型“指向(P1,...,Pn)返回函数的指针R”…]


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

该标准没有提到任何关于将隐式转换为重载的类类型operator()(又名函子)的内容,这意味着编译器不允许这样做。

您必须明确地转换它:

static_cast<Functor>(y)(5);
于 2012-01-15T20:45:25.333 回答