模板转换操作符如何指向成员函数语法的工作方式

时间:2013-08-02 14:09:40

标签: c++ templates pointer-to-member nullptr

我正在查看emulated version of nullptr并看到此转换运算符(nullptr_t的成员):

template<class C, class T>    // or any type of null
operator T C::*() const       // member pointer...
{ return 0; }

指向成员函数的指针语法让我感到困惑。我通常希望看到像

这样的类型
R (C::*)(I1, I2, ...)

使用上面的模板,没有输入参数。在这种情况下,我无法弄清楚类型推导是如何工作的。我在形成一个特定问题时遇到了麻烦,除此之外,这是如何工作的?如果我有这样的代码:

typedef int (MyClass::*MyTypedef)(float);
MyTypedef m = nullptr;

我猜T推断为int,C推断为MyClass。什么&#34;发生&#34;漂浮?

1 个答案:

答案 0 :(得分:2)

这是指向成员的指针,不一定是指向成员功能指针。不同之处在于它可以生成指向成员函数的指针或指向非函数成员的指针。

现在在特定用例中,目标是指向成员的指针,编译器正在查看需要int (MyClass::*)(float)的表达式,另一方面它具有nullptr。它会尝试查找转化,并找到operator T C::*(),如果C推断为MyClass并且T推断为int (float),则转化为有效转化} [函数接受float并返回int]。

我还发现语言的这个特殊角落有点令人困惑(有typedef或函数的推导类型),例如,如果怪异,这是合法的:

typedef void int_f(int);
struct X {
   int_f m;
};
void X::m(int x) { std::cout << x << '\n'; }

您关注的转换运算符中也会发生同样的事情。