Why is 'X x; x();' allowed, when 'X' defines a conversion to function pointer, but not, when it defines a conversion to a functor?

后端 未结 1 1083
-上瘾入骨i
-上瘾入骨i 2021-01-01 09:52
void f(int){}
typedef void (*f_ptr)(int);

struct Functor{
  void operator()(int){}
};

struct X{
  operator f_ptr(){ return f; }
};

struct Y{
  operator Functor(){         


        
相关标签:
1条回答
  • 2021-01-01 10:57
    x(5); // works ?!
    

    This implicitly casts x to an f_ptr and calls that. C++11 standard:

    § 13.3.1.1.2 Call to object of class type [over.call.object]

    2) In addition, for each non-explicit conversion function declared in T of the form

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

    […where conversion-type-id denotes the type “pointer to function of (P1,...,Pn) returning R”…]


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

    The standard doesn't mention anything about implicit conversion to class types that overload operator() (aka functors), which implies that the compiler doesn't allow that.

    You must cast it explicitly:

    static_cast<Functor>(y)(5);
    
    0 讨论(0)
提交回复
热议问题