c++ - 模板将运算符转换为指向成员函数语法的指针如何工作

标签 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。什么“碰巧”漂浮?

最佳答案

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

现在在特定的用例中,目标是一个指向成员的指针,编译器看到它需要一个 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/

相关文章:

c++ - 动态数组到两个函数

c++ - 如何转发声明从转发声明的模板基类派生的类?

c++ - 如何使用非类型模板参数和类型模板参数的混合来对函数进行模板化?

c++ - 如何使用 boost::bind 将成员函数绑定(bind)到任何对象

C++ - 将对象(如字符串)映射到表中的成员函数的正确方法

c++ - 下界比较函数

c++ - 可以使用函数指针数组来删除分支吗

c++ - 模块化计算器中的错误答案

c++ - 使用继承命名空间的模板类进行名称查找

c++ - 指向成员函数的函数指针