这个移动构造函数是否不必要

时间:2015-03-12 18:27:16

标签: c++ c++11

在以下代码中:

class Base
{
public:
    Base(const SomeClass& c) : m_c(c) {}
    SomeClass m_c;
};

class Derived : Base
{
public:
    Derived(const SomeClass& c) : Base(c) {}
    Derived(SomeClass&& c) : Base(static_cast<Base&&>(c)) {} // Unnecessary?
}

上面的移动构造函数是否不必要?我想不出这样一个场景,它会对左值参考提供任何优势吗?

1 个答案:

答案 0 :(得分:3)

好的,那段代码很奇怪。而且坏了。

static_cast<Base&&>(c)创建一个临时Base对象。然后,它会在elision被阻止的上下文中传递给临时基础对象Base作为Derived的基础。

这会导致首先复制传递的SomeClass&& c,然后将移动Base Derived。如果SomeClass缺少移动构造函数,则在这种情况下会导致 2 副本。

我想不出你想要这样做的原因。但是,在某些代码库中,我上面列出的副作用可能会产生可观察到的后果。

SomeClass移动构造的更常规方法是Derived( SomeClass&& c ):Base(std::move(c)) {}并将Base( SomeClass&& c ):m_c(std::move(c)) {}添加到Base。这会将SomeClass平稳地移动到基地的m_c而不是上面的体操。