我有一个类成员,它的类型通过使用std::function
绑定到this
指针std::bind
。
我实现了赋值运算符,它还必须复制可调用对象,但是问题在于,this
应该复制哪个?这个this
还是其他this
?
这是用于演示的示例可编译代码:
#include <functional>
#include <iostream>
using func = std::function<void()>;
struct A
{
~A()
{
std::cout << "---destructor: " << this << std::endl;
other_callable();
this_callable();
}
A(const char* name) :
mName(name)
{
other_callable = std::bind(&A::f, this);
this_callable = std::bind(&A::f, this);
}
A& operator=(const A& ref)
{
if (this != &ref)
{
other_callable = ref.other_callable;
this_callable = std::bind(&A::f, this);
mName = ref.mName;
}
return *this;
}
void f()
{
std::cout << mName << ": " << this << std::endl;
}
func other_callable;
func this_callable;
const char* mName;
};
int main()
{
A a("a");
A b("b");
a.other_callable();
b.this_callable();
std::cout << "-------------------" << std::endl;
a = b;
}
以下是非唯一示例输出:
a: 00000090447FF3E0
b: 00000090447FF490
-------------------
---destructor: 00000090447FF490
b: 00000090447FF490
b: 00000090447FF490
---destructor: 00000090447FF3E0
b: 00000090447FF490
b: 00000090447FF3E0
如您所见,在第二个实例中调用了非预期的可调用对象。
问题是什么?
问题在于this
存储在可调用对象内的指针,复制可调用对象也会复制this
指针,这意味着this
不再this
是“其他”。
为了理解我的问题,可调用对象是从外部代码调用的事件回调,它假定可调用将在this
实例上执行但它不会,它在复制的其他实例上执行。
我的问题是在这里实现复制语义的正确方法是什么?现在我更喜欢这个this_callable
版本,而不是other_callable
因为它指的是 thisthis
而不是 other this
。
但是我不确定这是好是坏,超出了它的预期效果,而简单地复制可调用(other_callable)会导致我的代码中的错误在这个例子之外不容易解释。
我的设计是否this_callable
可以接受,还是应该other_callable
用于复制语义并在其他地方更改设计?