C++ 自动推理失败?

C++ 自动推理失败?,c++,c++11,function-pointers,auto,member-pointers,C++,C++11,Function Pointers,Auto,Member Pointers,你知道为什么不能推断吗?我希望您能给出参考标准的答案 编辑: 我发现了一个名为_闭包的RAD Studio语言扩展,它似乎解决了这个问题。代码如下: 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

你知道为什么不能推断吗?我希望您能给出参考标准的答案

编辑:

我发现了一个名为_闭包的RAD Studio语言扩展,它似乎解决了这个问题。代码如下:

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
您不能使用

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;
}
就像你不能使用:

auto a2 = t1.*mf;  // error 
t1.f
不是有效的表达式。无法通过类的实例获取指向成员函数的指针。非成员函数在这样使用时会衰减为函数指针,与此不同,成员函数不会衰减为成员函数指针

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

一元运算符

4仅当使用显式
&
且其操作数是不包含在括号中的限定id时,才会形成指向成员的指针。[注意:也就是说,表达式
和(限定id)
,其中
限定id
包含在括号中,不构成“指向成员的指针”类型的表达式。
限定id
,因为不存在从非静态成员函数的限定id到类型的隐式转换“指向成员函数的指针”,因为从函数类型的左值到类型“指向函数的指针”(4.3)。也不是
&非限定id
指向成员的指针,即使在非限定id的类的范围内。-结束注释]


这就是现在的问题,不是吗?为什么它不能推断成员函数指针呢?@Lenz,如果
mf
不是文章的一部分,这就是问题所在。@Lenz:它不能推断成员函数指针,因为只能推断有效表达式,而且它不是有效表达式。为什么它不是有效表达式?因为这些是C++成员函数和成员指针的规则。@ R SAHU,T1.*MF是我可以应用的表达式()。如果它是一个表达式,在我看来,它应该有一个类型。如果它有一个类型,auto应该能够推断。我不确定这其中的哪一部分不太清楚?@Lenz,这是标准所说的。我不确定标准为什么会这样定义。我给标准开发人员一个质疑的好处,希望他们有充分的理由质疑别那样。
auto a2 = t1.f;