代码格式不正确:成员函数名(例如C::Foo)的使用方式只有几种,而这不是其中之一(有效使用的完整列表可以在C++ 语言标准,参见 C++11 §5.1.1/12)。
在您的示例上下文中,您唯一能做的就是获取成员函数的地址&C::Foo,以形成指向int (C::*)(int) 类型的成员函数的指针。
由于代码格式错误,编译器应该拒绝它。此外,根据C::Foo 的使用方式,它会产生不一致的结果;我们将看看下面的不一致。
请在Microsoft Connect 上报告错误。或者,请告诉我,我很乐意报告此问题。
如果你有一个类型但你不知道它是什么类型,你可以通过使用它来找出类型的名称,这会导致编译器发出错误。例如,声明一个类模板并且从不定义它:
template <typename T>
struct tell_me_the_type;
然后,你可以用你感兴趣的类型实例化这个模板:
tell_me_the_type<decltype(C::Foo)> x;
由于tell_me_the_type尚未定义,x的定义无效。编译器应该在它发出的错误中包含T 类型。 Visual C++ 2012 RC 报告:
error C2079: 'x' uses undefined struct 'tell_me_the_type_name<T>'
with
[
T=int (int)
]
编译器认为C::Foo 是int (int) 类型。如果是这种情况,那么编译器应该接受以下代码:
template <typename T>
struct is_the_type_right;
template <>
struct is_the_type_right<int(int)> { };
is_the_type_right<decltype(C::Foo)> x;
编译器不接受此代码。它报告以下错误:
error C2079: 'x' uses undefined struct 'is_the_type_right<T>'
with
[
T=int (int)
]
所以,C::Foo 都是 int (int) 类型,而不是 int (int) 类型,这违反了 principle of noncontradiction。 :-)