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

2023-12-07

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

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

由于不存在成员函数类型这样的类型(没有,是吗?),我希望C::type to be int (int).

但以下内容无法使用 Visual C++ 2012 RC 进行编译:

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

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


代码格式不正确:成员函数的命名方式只有几种(例如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),这违反了不矛盾原则. :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

decltype 和成员函数(非指针)类型 的相关文章

随机推荐