Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复制交换习惯用法-我们可以在这里使用动态强制转换操作吗?_C++ - Fatal编程技术网

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

C++ 复制交换习惯用法-我们可以在这里使用动态强制转换操作吗?,c++,C++,我正在阅读有关复制交换习惯用法的文章,在一个示例中,交换方法的实现方式如下: class Derived : public Base { public: std::string title = ""; details *detail = nullptr; void swap(Derived& lhs, Derived& rhs) { using std::swap; Base&am

我正在阅读有关复制交换习惯用法的文章,在一个示例中,交换方法的实现方式如下:

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

您可以始终将
静态\u强制转换为明确可见的基类
dynamic_cast
用于相反方向-从基类指针/引用转换到可能无效的派生类。在这里完全没有必要,但是是的,它是安全的,因为它将具有与
static\u cast
相同的效果

看第三点

3) 如果
new\u type
是指向
Base
的指针或引用,则 表达式是指向
派生的
的指针或引用,其中
是 派生的
的唯一、可访问的基类,结果是指针或 对
派生的
对象中的
类子对象的引用 通过表达指向或识别的。(注:隐式强制转换和
static\u cast
也可以执行此转换。)


您可以始终将
静态\u强制转换为明确可见的基类
dynamic_cast
用于相反方向-从基类指针/引用转换到可能无效的派生类。在这里完全没有必要,但是是的,它是安全的,因为它将具有与
static\u cast
相同的效果

看第三点

3) 如果
new\u type
是指向
Base
的指针或引用,则 表达式是指向
派生的
的指针或引用,其中
是 派生的
的唯一、可访问的基类,结果是指针或 对
派生的
对象中的
类子对象的引用 通过表达指向或识别的。(注:隐式强制转换和
static\u cast
也可以执行此转换。)



首先,我认为您的代码是错误的,您应该用
base&
替换
base
。然后,如果要使用动态转换,应该编写
std::swap(*lb,*rb)
,否则它不会交换基本成员。最后,总是更喜欢静态转换而不是动态转换,因为它是在编译时完成的(动态转换可能会在运行时失败)。复制然后交换与您的代码有什么关系?@OlivierSohn我修复了这个问题typo@MistyD什么是
base
,您应该将
base
替换为
base&
。然后,如果要使用动态转换,应该编写
std::swap(*lb,*rb)
,否则它不会交换基本成员。最后,总是更喜欢静态转换而不是动态转换,因为它是在编译时完成的(动态转换可能会在运行时失败)。复制然后交换与您的代码有什么关系?@OlivierSohn我修复了这个问题typo@MistyD什么是
base
?@OlivierSohn对不起,我是说
base
,谢谢你澄清了这一点。在旁注中,我还看到了静态强制转换向下(从基到派生),其中动态强制转换更好,因为它提供了检查。在大多数情况下,我仍然对何时使用静态\u cast感到困惑,所以我坚持使用动态cast。我不同意:它没有相同的效果,因为动态\u cast是在运行时完成的。结果与静态\u-cast相同,但使用动态\u-cast时开销更大。@在某些情况下,您不需要运行时检查,因为您知道
静态\u-cast
将成功。这就像检查向量的大小一次,然后使用
操作符[]
而不是
@OlivierSohn上执行
操作,只有在真正使用
动态\u cast
而不是
静态\u cast
的功能时,才会执行运行时检查。你所说的对我来说没有多大意义。@LogicStuff事实上,我认为rtti类型检查在所有情况下都是完成的,但似乎不是。谢谢你指出这一点!谢谢你澄清这一点。在旁注中,我还看到了静态强制转换向下(从基到派生),其中动态强制转换更好,因为它提供了检查。在大多数情况下,我仍然对何时使用静态\u cast感到困惑,所以我坚持使用动态cast。我不同意:它没有相同的效果,因为动态\u cast是在运行时完成的。结果与静态\u-cast相同,但使用动态\u-cast时开销更大。@在某些情况下,您不需要运行时检查,因为您知道
静态\u-cast
将成功。这就像检查向量的大小一次,然后使用
操作符[]
而不是
@OlivierSohn上执行
操作,只有在真正使用
动态\u cast
而不是
静态\u cast
的功能时,才会执行运行时检查。你所说的对我来说没有多大意义。@LogicStuff事实上,我认为rtti类型检查在所有情况下都是完成的,但似乎不是。谢谢你指出这一点!
Base* lb = dynamic_cast<Base*>(&lhs)
Base* rb = dynamic_cast<Base*>(&rhs)
std::swap(*lb,*rb);