复制交换习惯用法-我们可以在这里使用动态强制转换操作吗

Copy swap idiom - Can we use a dynamic cast operation here?

本文关键字:动态 转换 操作 在这里 惯用法 习惯 交换 我们 复制      更新时间:2023-10-16

我读到了关于复制交换习惯用法的文章,在一个示例中,交换方法以以下方式实现:

class Derived : public Base
{
public:
std::string title = "";
details *detail = nullptr;
void swap(Derived& lhs, Derived& rhs) 
{
using std::swap;
Base& lb = static_cast<Base&>(lhs); 
Base& rb = static_cast<Base&>(rhs);
std::swap(lb,rb);
std::swap(lhs.title, rhs.title);
std::swap(lhs.detail, rhs.detail);
}
//Regular Contructor
Derived() { /*...*/ }
....
}

现在在交换方法中有一个特殊的原因是使用了static_cast。使用像这样的动态投射是否安全

Base* lb = dynamic_cast<Base*>(&lhs)
Base* rb = dynamic_cast<Base*>(&rhs)
std::swap(*lb,*rb);

您可以始终将static_cast转换为明确可见的基类。dynamic_cast的使用方向相反——从基类指针/引用转换为可能无效的派生类。这里完全没有必要,但是的,它是安全的,因为它将具有与static_cast相同的效果。

看看这里的第三点。

3(如果new_type是指向Base的指针或引用表达式是指向Derived的指针或引用,其中BaseDerived的唯一、可访问基类,结果是指针或引用Derived对象中的Base类子对象通过表达指向或识别。(注意:隐式强制转换和static_cast也可以执行这种转换。(