假设我有3个班级:Base
,Derived
和Chunky
。 Derived
源自Base
,Base
的成员类型Chunky
(Chunky
很大,我不想复制它,除非我必须)。
以下是Base
,假设我们无法以任何方式更改它(不,我们无法为其创建构造函数):
class Base
{
public:
Chunky monkey;
}
Derived
看起来像这样:
class Derived : public Base
{
// option 1
Derived(Chunky const& monkey)
{
this->monkey = monkey;
}
// option 2
Derived(Chunky monkey)
{
// does this do anything useful, or am I wasting my time by calling std::move?
this->monkey = std::move(monkey);
}
}
我更喜欢选项2,因为意图更清晰,我不必创建参考值,但是当std::move
无法初始化时,我们仍然可以获得monkey
的好处构造函数初始化列表? 你如何解决这个问题(再次假设Base
无法改变)?
如果有人想知道, monkey 在这种情况下是一个std :: function,而this discussion并没有真正回答我的问题。
答案 0 :(得分:1)
是的,即使移动不在成员初始化列表中,在第二种情况下移动仍然有好处。但要注意,在这种情况下,使用移动赋值而不是移动构造,因此Chunky
类型需要支持它。由于Chunky
是std::function
,所以可以。
第二个选项似乎更合适,因为与第一个选项相比,它可以避免复制。在更好的情况下,它只需要两个动作,但在更糟糕的情况下,执行一个副本然后移动。第一个选项总是需要一个副本。