概要
当类使用多重继承时,如何安全地设计 move 构造函数?
详情
考虑以下场景:
struct T { };
struct U { };
struct X : public T, public U
{
X(X&& other)
: T(std::move(other))
, U(std::move(other)) // already moved?!
{
}
};
有没有办法安全地 move 构造 T
和 U
?
最佳答案
tl;dr:问题中的代码没问题。
上面的代码很好,因为 std::move
本身实际上并没有以任何方式改变 other
,它只是做了一个转换来使 other
到右值引用中,以便调用 T
和 U
的 move 构造函数而不是它们的复制构造函数。
当 T(std::move(other))
运行时,T
的 move 构造函数将被调用(假设它有一个)并且
将被 move 到other
中的Tthis
中的T
。 other
中的 U
将保持独立,直到 U(std::move(other))
运行。
请注意,这意味着当您的 X
move 构造函数代码运行时,您不能依赖 T
和 U
的成员/成员函数> 在 other
中,因为 other
的那些位已经被 move 了。
附带说明,可以通过更改为:
X(X&& other)
: T(std::move(static_cast<T&>(other)))
, U(std::move(static_cast<U&>(other)))
{
}
因为这个版本不依赖从 X&&
到 T&&
/U&&
的隐式向上转换。依赖于隐式向上转换可能是一个问题,因为 T
和/或 U
可能有一个 T(X&&)
构造函数或一个接受任何模板构造函数,其中任何一个都会被选中,而不是您真正想要调用的 T(T&&)
move 构造函数。
关于c++ - move 构造函数和多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10114701/