有一个带有一些复制字段的类。
class Foo{
Bar _bar;
//...
};
在移动语义之前,我会说初始化_bar
它的最好方法是传递一个常量引用:
Foo::Foo(const Bar &bar) :
_bar(bar)
{}
但为了让我们的生活变得更加艰难和美好,移动语义出现了。我有一个问题。现在初始化类字段的最佳方法是什么?粗略地说,这一切都归结为:
Foo::Foo(const Bar &bar) :
_bar(bar)
{}
对比
Foo::Foo(Bar bar) :
_bar(std::move(bar))
{}
很明显,在某些情况下,一个构造函数更好,而在其他情况下,另一个构造函数更好。关于这个主题是否有任何“经验法则”或最佳实践?
这完全取决于 Bar 是否具有移动构造函数。
如果不是,那么一个恒定的参考将是最好的解决方案:
如果存在,那么最好使用一个临时对象,在优化阶段会内联不必要的动作:
如果你不知道他是否,你可以试试这个选项:
嗯...在我看来,它更好
Foo::Foo(const Bar &bar)
,而且Foo::Foo(Bar&& bar)
。如果无法移动,您的版本
Foo::Foo(Bar bar)
将不是最好的Bar
- 只会有额外的副本。您有一个带有两个构造函数的“详细”实现
分别用于复制和单独用于移动。
具有一个构造函数的“懒惰”实现
它涵盖了前两个的功能,而效率损失可以忽略不计。
转发是一种直接构造的实现选项
_bar
,无需创建中间Bar