C++ 11构造函数参数:std :: move和value或std :: forward和rvalue引用

bob*_*bah 2 c++ rvalue-reference move-semantics copy-elision c++11

下面哪两个应该是首选,为什么?

struct X {
    Y data_;
    explicit X(Y&& data): data_(std::forward<Y>(data)) {}
};
Run Code Online (Sandbox Code Playgroud)

VS

struct X {
    Y data_;
    explicit X(Y data): data_(std::move(data)) {}
};
Run Code Online (Sandbox Code Playgroud)

nos*_*sid 5

这两种变体的功能不同.以下陈述适用于第二个 - 但不适用于第一个:

Y y;
X x(y);
Run Code Online (Sandbox Code Playgroud)

如果您正在寻找相同的功能,这两个变体应如下所示:

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)) { }
};
Run Code Online (Sandbox Code Playgroud)

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