繁体   English   中英

成员函数的模板推导

[英]template deduction of member functions

我试图通过常规函数、指向常规函数的指针、成员函数和指向成员函数的指针来理解模板参数推导。 有人可以解释为什么最后一行会产生编译错误而独立没有问题吗?

#include <iostream>
#include <type_traits>
 
struct A {
    int fun(float, char) const&;
};
 
void standalone(int, char) {}

template <typename T>
void what(T &&) {
    std::cout << __PRETTY_FUNCTION__ << "\n";
}
 
int main() 
{
    what(standalone); // void what(T&&) [with T = void (&)(int, char)]
    what(decltype(&standalone){}); // void what(T&&) [with T = void (*)(int, char)]
    what(decltype(&A::fun){}); // void what(T&&) [with T = int (A::*)(float, char) const &]
    what(A::fun); // main.cpp: In function 'int main()':
                  // main.cpp:30:13: error: invalid use of non-static member function 'int A::fun(float, char) const &'
      |           // what(A::fun);
      |             ^~~
}

问题是我们不能将引用传递给成员,因为从指针到成员

“指向成员的指针”类型与“指针”类型不同,即指向成员的指针仅由指向成员声明符语法声明,从不由指针声明符语法声明。 C++ 中没有“reference-to-member”类型

这意味着我们必须在调用表达式中显式使用运算符的地址来传递一个指向成员的指针(因为不允许引用成员),如下所示:

//-------v---------> must explicitly use address of operator
    what(&A::fun); 

边注

尽管与您的情况无关,但请注意,与普通的 function 指针不同,成员 function 与指向该成员的指针之间没有自动转换 也就是说,对于成员函数和需要(允许)指针的上下文,表达式A::fun&A::fun不等价的。

对于独立的 function,指向 function 的指针可以根据上下文转换为 function 引用,例如为了被调用。 function 可以转换为指向自身的指针。 结果这两条线既合法又相等。

what(standalone); 
what(*********************************************standalone); // stars!

对于每颗星,它的参数都是一个引用,并根据上下文转换为一个指针,结果将是一个引用,等等。 在 C++ 中,function(参考)是一种类型。

表达式&standalone明确地是一个指针,所以what(&standalone); 将使用指针。

现在,指向成员的指针是一种不同于普通指针的类型,并且没有类似的引用形式。 获取指向成员 function 或成员变量的指针的唯一合法方法是将一元运算operator&与其嵌套名称组合。

非静态成员函数与自由函数有很大不同。 它们只能以非常有限的方式使用。

非静态成员 function 的唯一可能用途是在成员访问表达式中调用 function 或作为&的操作数以形成指向成员的指针。

A::fun前面没有&或成员访问运算符,它本身在表达式中甚至在语法上都不正确。 decltype(A::fun)也是病式的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM