decltype和成员函数(非指针)类型

时间:2012-07-06 01:46:54

标签: c++ visual-c++ c++11 decltype visual-c++-2012

struct C
{
    int Foo(int i) { return i; }

    typedef decltype(C::Foo) type;
};

由于没有成员函数类型这样的类型(没有,有吗?),我希望C::typeint (int)

但是以下内容不能使用Visual C ++ 2012 RC进行编译:

std::function<C::type> f;

那么decltype(C::Foo)是什么类型的?

2 个答案:

答案 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是不正确的。