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

问题描述 投票:0回答:1

代码如下。

std::string::empty()应将this指针作为类型为pointerstd::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
c++ std-function this-pointer
1个回答
2
投票

std::function可以接受与其类型签名匹配的任何Callable。调用时,将使用以下规则(引用cppreference)评估可调用对象和参数:

  • 如果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()

© www.soinside.com 2019 - 2024. All rights reserved.