簡體   English   中英

復制交換習慣用法-我們可以在這里使用動態轉換操作嗎?

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

我正在閱讀有關復制交換習慣的知識,在一個示例中,交換方法是通過以下方式實現的:

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() { /*...*/ }
      ....
}

現在,在swap方法中,有一個特殊的原因使用了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 ,其中Base是一個獨特的,可訪問的基類的Derived ,其結果是一個指針或參考Base內類子對象通過表達式指向或標識的Derived對象。 (注意:隱式static_cast轉換和static_cast也可以執行此轉換。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM