以下哪两个应该首选,为什么?
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)) {}
};
答案 0 :(得分:5)
这两种变体的功能不同。以下陈述适用于第二个 - 但不适用于第一个:
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)) { }
};
第一个变体保存了一个 move 操作,而第二个变体则少了写入。所以,答案是:只要您没有理由优化性能,就使用后者。