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);