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