struct C
{
int Foo(int i) { return i; }
typedef decltype(C::Foo) type;
};
由于没有成员函数类型这样的类型(没有,有吗?),我希望C::type
为int (int)
。
但是以下内容不能使用Visual C ++ 2012 RC进行编译:
std::function<C::type> f;
那么decltype(C::Foo)
是什么类型的?
答案 0 :(得分:7)
代码格式错误:只有几种方法可以使用成员函数名称(例如C::Foo
),而这不是其中之一(可以找到有效用途的完整列表)在C ++语言标准中,参见C ++11§5.1.1/ 12)。
在您的示例的上下文中,您唯一能做的就是获取成员函数&C::Foo
的地址,以形成指向int (C::*)(int)
类型的成员函数的指针。 / p>
由于代码格式错误,编译器应该拒绝它。此外,它会产生不一致的结果,具体取决于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。 : - )
答案 1 :(得分:1)
那么
decltype(C::Foo)
是什么类型的?
这不是类型,因为仅使用C::Foo
是不正确的。