代码格式不正确:成员函数的命名方式只有几种(例如C::Foo
) 可以使用,但这不是其中之一(有效用法的完整列表可以在 C++ 语言标准中找到,请参阅 C++11 §5.1.1/12)。
在您的示例上下文中,您真正能做的唯一事情就是获取成员函数的地址,&C::Foo
,形成一个指向成员函数的指针,类型为int (C::*)(int)
.
由于代码格式错误,编译器应该拒绝它。此外,它会产生不一致的结果,具体取决于如何C::Foo
用来;我们将看看下面的不一致之处。
请报告错误微软连接。或者,请告诉我,我很乐意报告该问题。
如果您有一个类型,但不知道该类型是什么,则可以通过以导致编译器发出错误的方式使用该类型来找出该类型的名称。例如,声明一个类模板但不定义它:
template <typename T>
struct tell_me_the_type;
然后,您可以使用您感兴趣的类型实例化该模板:
tell_me_the_type<decltype(C::Foo)> x;
Since tell_me_the_type
尚未定义,定义为x
是无效的。编译器should包括类型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)
]
So, C::Foo
两者都是类型int (int)
并且不是类型int (int)
,这违反了不矛盾原则. :-)