Argumento do construtor C ++ 11: std :: move e value ou std :: forward e rvalue reference

Qual dos dois abaixo deve ser o preferido e por quê?

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