在以下代码中:
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?
}
上面的移动构造函数是否不必要?我想不出这样一个场景,它会对左值参考提供任何优势吗?
答案 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
而不是上面的体操。