使用 std::function 在非指针对象上调用的成员函数



代码如下。

std::string::empty()应将this指针作为类型为指针的参数,std::string *.

23线的呼叫怎么可能没问题?

#include <iostream>
#include <functional>
int main() {
std::string str{"A small pond"};
std::function<bool(std::string*)> fp = &std::string::empty;
std::cout << fp(&str) << std::endl; // 1
std::function<bool(std::string)> f = &std::string::empty;
std::cout << f(str) << std::endl; // 2
std::function<bool(std::string&)> fr = &std::string::empty;
std::cout << fr(str) << std::endl; // 3
}
/*
output:
0
0
0
*/
clang version 9.0.0-2~ubuntu18.04.2 (tags/RELEASE_900/final)
g++ (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0

std::function可以接受与其类型签名匹配的任何可调用对象。调用时,使用以下规则(引用 cpp首选项)计算可调用对象和参数:

  • 如果f是指向类T的成员函数的指针:
    • 如果std::is_base_of<T, std::decay_t<decltype(t1)>>::valuetrue,则INVOKE(f, t1, t2, ..., tN)等效于(t1.*f)(t2, ..., tN)
    • 如果std::decay_t<decltype(t1)>std::reference_wrapper的专业化,那么INVOKE(f, t1, t2, ..., tN)是 相当于(t1.get().*f)(t2, ..., tN)
    • 如果t1不满足前面的项目,则INVOKE(f, t1, t2, ..., tN)等效于((*t1).*f)(t2, ..., tN)

因此,第一种情况像(*t1).*f()一样评估,另外两种情况像t1.*f()一样评估。

最新更新