gpt4 book ai didi

c++ - 为什么 std::bind 在使用引用传递时阻止后期绑定(bind)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:06 24 4
gpt4 key购买 nike

<分区>

我有一个基类、一个派生类和一个虚拟成员函数。我还有一个函数,它采用基类引用并对成员函数进行多态调用:

#include <iostream>
#include <functional>
class Base
{
public:
Base() {}
virtual int getnum() { return 1; }
};

class Derived : public Base
{
public:
Derived() {}
virtual int getnum() { return 2; }
};

int getnumref(Base& b) { return b.getnum(); }

int main()
{
Derived d;
Base& bref = d;
std::cout << getnumref(bref) << std::endl;
}

此处,发生后期绑定(bind),输出为2

但是,如果我现在将以下行添加到 main() 函数中,以便预先定义函数的参数,然后调用它:

std::function<int()> boundgetnumref = std::bind(getnumref, bref);
std::cout << boundgetnumref() << std::endl;

那么最后一行的输出是1,即这里发生了早期绑定(bind),调用了基类的成员函数。

如果我使用指针,即

//...
int getnumptr(Base* b) { return b->getnum(); }
//...
int main()
{
Derived d;
Base* bptr = &d;
std::cout << getnumptr(bptr) << std::endl;
std::function<int()> boundgetnumptr = std::bind(getnumptr, bptr);
std::cout << boundgetnumptr() << std::endl;
}

然后 cout 调用的输出都是 2

为什么当我将引用传递与 std::bind 一起使用时会发生早期绑定(bind),而不是其他情况?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com