我正在查看 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。什么“碰巧”漂浮?
最佳答案
那是一个指向成员的指针,不一定是指向成员函数的指针。不同之处在于它可以生成指向成员函数的指针或指向非函数成员的指针。
现在在特定的用例中,目标是一个指向成员的指针,编译器看到它需要一个 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'; }
您关注的转换运算符中发生了同样的事情。
关于c++ - 模板将运算符转换为指向成员函数语法的指针如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18018992/