应该首选以下两个中的哪一个?
struct X {
Y data_;
explicit X(Y&& data): data_(std::forward<Y>(data)) {}
};
vs
struct X {
Y data_;
explicit X(Y data): data_(std::move(data)) {}
};
两个变体在功能上有所不同。以下陈述适用于第二个陈述 - 但对第一个陈述不行:
Y y;
X x(y);
如果您正在寻找相同的功能,则两个变体应该如下:
struct X
{
Y data_;
explicit X(const Y& data) : data_(data) { }
explicit X(Y&& data) : data_(std::move(data)) { }
};
struct X
{
Y data_;
explicit X(Y data) : data_(std::move(data)) { }
};
第一个变体保存一个移动操作,而第二个变体则较少写。因此,答案是:使用后者,只要您没有理由优化性能。