1

我正在查看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。什么“发生”浮动?

4

1 回答 1

2

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

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

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

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

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

于 2013-08-02T14:13:36.803 回答