1
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)呢?

4

2 回答 2

8

代码格式错误:成员函数名(例如 )只有几种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是 type 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),这违反了不矛盾的原则。:-)

于 2012-07-06T02:10:10.413 回答
1

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

它不是类型,因为使用 justC::Foo是不正确的。

于 2012-07-06T01:53:01.173 回答