C 11构造函数参数:std ::移动和值或std :: forward and rvalue参考



应该首选以下两个中的哪一个?

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)) { }
};

第一个变体保存一个移动操作,而第二个变体则较少写。因此,答案是:使用后者,只要您没有理由优化性能。

最新更新