2

Which of the below two should be preferred and why?

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

1 回答 1

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

第一个变体节省了一次移动操作,而第二个变体写得更少。所以,答案是:只要你没有理由优化性能,就使用后者。

于 2014-03-11T19:36:19.190 回答