自动无法推断?

时间:2017-02-16 23:20:42

标签: c++ c++11 function-pointers auto member-pointers

struct test 
{
  void f() {};
};
test t1;

using memfun_t = void (test::*)();
memfun_t mf = &test::f;


auto a1 = &test::f; // OK 
auto a2 = t1.*mf;  // error 
auto a3 = &(t1.*mf); // still no luck

为什么不能推断这个想法?我很感激参考标准的答案。

编辑:

我找到了一个名为__closure的RAD Studio语言扩展,似乎正在解决此问题。1以下是代码:

class base {
public:
    void func(int x) {
    };
};

typedef void(base::*pBaseMember)(int);

class derived : public base {
public:
    void new_func(int i) {
    };
};

int main(int argc, char * argv[]) {
    derived derivedObject;
    void(__closure * derivedClosure)(int);

    // Get a pointer to the ‘new_func’ member.
    // Note the closure is associated with the
    // particular object, ‘derivedObject’.
    derivedClosure = derivedObject.new_func;

    derivedClosure(3); // Call ‘new_func’ through the closure.
    return 0;
}

http://docwiki.embarcadero.com/RADStudio/Seattle/en/Closure

1 个答案:

答案 0 :(得分:1)

您无法使用

auto a2 = t1.*mf;  // error 

就像你无法使用:

auto a2 = t1.f;

t1.f不是有效的表达式。无法通过类的实例获取指向成员函数的指针。与非成员函数不同,非成员函数在使用时衰减为函数指针,成员函数不会衰减到成员函数指针。

C ++ 11标准中的相关文本:

  

一元运算符

     

...

     

4只有在使用显式&并且其操作数是未括在括号中的qualified-id时,才会形成指向成员的指针。 [注意:即表达式&(qualified-id),其中qualified-id括在括号中,不会形成“指向成员的指针”类型的表达式。{{{ 1}},因为没有从非静态成员函数的 qualified-id 到类型“指向成员函数的指针”的隐式转换,因为从函数类型的左值到类型“指向功能的指针”(4.3)。也不是   qualified-id指向成员的指针,即使在 unqualified-id 的类的范围内也是如此。 -end note ]